2011-01-29 35 views
0

我有点迷路了MEF,MAF,Unity ...C#.NET 4.0窗体插件管理器

这个问题是关于Winform应用程序的体系结构。

我有一个主要的项目,其中包含一个主窗体和其他形式;

因为我想包括模块性,我想使用插件系统。

我想什么做的是打开每个插件DLL文件主应用程序打开与按钮,工具栏引用每个...

然后我想处置他们,直到他们被称为。

但我不希望所有的插件保存在内存中..只是为了得到一个好的架构模型。

因此,首先有关.NET: 不dotNet的保存在内存中只有参考对DLL插件或全部插件代码

我正在考虑使用MEF与LAZY集合的导入,但我需要首先实例化它们以获取我的按钮信息。所以第二个问题

如果我设置了进口代收到null,再次劳克的compose()功能,插件将负载或等待呼叫进行负载(懒惰)?

+0

你可以尝试改述你的问题吗?似乎有点困惑和一般。 – tomfanning 2011-01-29 12:56:19

回答

2

然后我想处置它们直到它们被调用。

相反检查导入的对象,然后扔掉,你应该检查进口metadata。您可以通过导入Lazy<IFoo,IFooMetadata>Lazy<IFoo,Dictionary<string,object>>来获取此元数据。您可以使用ExportMetadata属性将此元数据添加到导出。

因此,首先有关.NET:是否dotNet的只保留在内存中的DLL插件或所有插件代码的参考?

加载程序集后,它将一直保留在内存中,除非卸载整个AppDomain。

另外,在.NET 4.0中没有ComposablePartCatalog的开箱即用的实现,可以在不加载相应程序集的情况下查询。但理论上讲,如果将元数据存储在程序集外的某个位置,可以完成这样的工作。 MEF code on codeplex中有一个这样的实现示例。

我想使用MEF与进口

使用懒进口未必会阻止加载组件的延迟集合的。如果您有对Lazy<IFoo>对象的引用,则至少必须加载包含IFoo的程序集。正如我上面所解释的那样,包含导出的IFoo实现的程序集也将在此时加载。

使用Lazy将只推迟一些构造函数的调用,希望能够更快地启动您的应用程序。