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 DirectoryCatalog 多次读取相同的 dll

目录将包含检测到的任何内容的导入和导出定义。不管你是否真的需要它。

这是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 对组件基数(事物数量(有很强的规则,以确保永远不会有任何意外,但这确实意味着您必须小心部署。