关于c#:MEF DirectoryCatalog多次读取相同的dll

MEF DirectoryCatalog reads the same dll many times

我有一个简单的MEF实现,从一个目录加载一些DLL(插件)。这在mef1下运行得很好,但现在我想对mef2使用相同的功能,它给了我一个IEnumerable,它包含目录中的正确的dll计数,但所有程序集都相同。

例如,我在目录中有两个程序集:fakeplugin1.dll和fakeplugin2.dll。它们导出FakePlugin1和FakePlugin2类。现在,当我调用container.composeparts()时,列表中没有用importmany和container修饰的内容。目录中包含两个程序集,但这两个程序集都是fakeplugin1。

代码如下:

1
2
3
4
5
6
[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,要么选择筛选您需要的插件。

那么,如何优雅地处理多个插件呢?试试这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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 is a type provided by MEF to hold indirect
references to exports. Here, in addition to the exported object
itself, you also get export metadata, or information that describes
the exported object. Each Lazy contains an IOperation
object, representing an actual operation, and an IOperationData
object, representing its metadata.

http://msdn.microsoft.com/en-us/library/dd460648.aspx进一步导入和导入

MEF对组件基数(事物的数量)有很强的规则,以确保不会有任何意外,但这意味着您必须小心部署。