UPDATE
当我尝试让 MEF 在我的应用程序中工作时,我遇到了越来越多的地方,我只是不明白为什么它没有在我期望的时候自动创建我的库。我认为这一切都回到了 Reed 所说的需要 MEF 来创造一切。现在,我有一个 XML 读取器类需要使用我的 CandySettings,但即使它的 ICandySettings 属性具有 [Import] 属性,它也不会被导入。首先我发现[导入]不适用于静态,所以我改变了这一点。但之后还是不行。我认为这是因为我手动创建了 XML 读取器对象,而 MEF 希望我做的是[导入] XML 读取器...这意味着我现在也必须有一个接口。
这几乎就像使用 IoC(或者至少对于 MEF 而言)一样,这是一件要么全有要么全无的事情。您不能随意使用它,因为最终您想要注入属性的任何类也需要由 MEF 创建。
如果我错了请纠正我!
原帖
嗯,情况还没有那么糟糕。 :) 但在 Reed 向我指出 MEF 作为 IoC 的潜在替代品之后我确实有疑问(到目前为止它看起来确实不错)。
考虑以下模型:替代文本 http://bit.ly/9W0sHt
如您所见,我有一个应用程序,并且该应用程序使用插件(哎呀,错过了那个关联!)。应用程序和插件都需要使用 CandySettings 类型的对象,该对象可以在另一个程序集中找到。
我首先尝试在 MEF 中使用 ComposeParts 方法,但是我可以让它工作的唯一方法是在plugin code.
var container = new CompositionContainer();
container.ComposeParts(this, new CandySettings());
但这没有任何意义,因为为什么我要在插件中创建 CandySettings 的实例?应该在应用程序中。但是,如果我将其放入应用程序代码中,则插件不会神奇地弄清楚如何获取 ICandySettings,即使我在插件中使用 [Import],并在 CandySettings 中使用 [Export]。EDIT(可能是因为我应该从应用程序调用 ComposeParts() 然后将插件传递给它?)
我的方法是使用MEF目录目录,因为这允许插件在构建时扫描当前文件夹中的所有程序集并自动导入标有 [Import] 属性的所有内容。所以它看起来像这样,并且可能在every plugin:
var catalog = new DirectoryCatalog(".");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
这完全有效,但我忍不住想这不是 MEF 的用途?