0

我对 MEF、MAF、Unity 有点迷茫……

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

我有一个主项目,其中包含一个主窗体和一些其他窗体;

因为我想包含模块化,所以我正在考虑使用插件系统。

我想做的是在打开主应用程序时打开每个插件 Dll以使用按钮、工具栏...

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

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

所以首先关于 .NET:dotNet 是否只保留对内存中 dll 插件或所有插件代码的引用

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

如果我将 Import Collection 设置为null并再次启动compose()函数,插件将被加载或等到调用加载(惰性)?

4

1 回答 1

2

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

您应该检查导入的元数据,而不是检查导入的对象然后将其丢弃。您可以通过导入Lazy<IFoo,IFooMetadata>或来获取此元数据Lazy<IFoo,Dictionary<string,object>>。您可以使用该ExportMetadata属性将此元数据添加到导出中。

所以首先关于 .NET:dotNet 是否只保留对内存中 dll 插件或所有插件代码的引用?

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

此外,.NET 4.0 中没有开箱即用的实现ComposablePartCatalog,可以在不加载相应程序集的情况下进行查询。但从理论上讲,如果您将元数据存储在程序集之外的某个位置,则可以完成类似的操作。codeplex 上的 MEF 代码中有一个这样的实现示例。

我正在考虑将 MEF 与导入的 LAZY 集合一起使用

使用延迟导入不一定会阻止程序集被加载。如果您有对Lazy<IFoo>对象的引用,则至少IFoo必须加载包含的程序集。正如我上面解释的那样,包含导出IFoo实现的程序集也将在此时加载。

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

于 2011-01-29T18:16:01.137 回答