MEF DirectoryCatalog 多次读取相同的 dll
本文关键字:dll 读取 DirectoryCatalog MEF | 更新日期: 2023-09-27 18:34:28
我有一个简单的MEF实现,从目录中加载一些dll(插件(。这在 MEF1 下运行良好,但现在我想在 MEF2 中使用相同的功能,它为我提供了一个 IEnumerable,其中包含目录中但所有程序集都相同的 dll 的正确计数。
例如,我在目录中有两个程序集:fakeplugin1.dll 和 fakeplugin2.dll。他们导出FakePlugin1和FakePlugin2类。现在当我调用容器时。ComposeParts(( 我在列表中没有任何装饰有 ImportMany 和容器的内容。目录在目录中包含两个程序集,但它们都是 FakePlugin1。
代码如下:
[ImportMany(typeof (IDCPlugin))]
IEnumerable<IDCPlugin> workplaceControllers;
var catalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);
var agcatalogue = new AggregateCatalog(catalog);
var container = new CompositionContainer(agcatalogue);
container.ComposeParts();
我正在尝试使用ExportFactory和RegistrationBuilder,但我刚刚意识到,即使是基本功能也无法按预期工作。
我做错了什么?我应该知道的 MEF2 有什么变化吗?如何加载两个不同的程序集?:)
提前感谢您的帮助!
编辑:它始终在文件夹中创建第一种类型的两个实例(在 abc 中升序(。如果我在文件夹中放另一个,它会创建三个相同的,依此类推。
编辑:我已经将代码上传到 pastebin,该代码与 MEF2 给出相同的结果:http://pastebin.com/3fWcujPS
目录将包含检测到的任何内容的导入和导出定义。不管你是否真的需要它。
这是MEF的一个"功能"。您需要ImportMany
并有选择地过滤所需的插件。
那么如何优雅地处理多个插件呢?试试这个:
[Export]
public class PluginService
{
public const string BEST_PLUGIN = "BestPlugin";
[ImportMany]
public IEnumerable<Plugin> Plugins{ private get; set; }
[Export(BEST_PLUGIN)]
public Plugin BestPlugin{ get { return GetBestPlugin(); } }
Plugin GetBestPlugin()
{
return Plugins.FirstOrDefault(); //or some other logic for selection
}
}
如果您的插件是资源密集型的,您可能需要考虑延迟初始化。
Lazy<T, TMetadata>
是MEF提供的一种类型,用于持有间接 对导出的引用。在这里,除了导出的对象 本身,您还可以获得导出元数据或描述的信息 导出的对象。每个Lazy<T, TMetadata>
都包含一个IOperation
对象,表示实际操作和IOperationData
对象,表示其元数据。
http://msdn.microsoft.com/en-us/library/dd460648.aspx#further_imports_and_importmany
MEF 对组件基数(事物数量(有很强的规则,以确保永远不会有任何意外,但这确实意味着您必须小心部署。