gpt4 book ai didi

c# - MEF = 可能会遇到挫折?

转载 作者:太空狗 更新时间:2023-10-29 18:33:26 25 4
gpt4 key购买 nike

更新

当我试图让 MEF 在我的应用程序中正常工作时,我遇到了越来越多的地方,我只是不明白为什么它没有在我期望的时候自动创建我的库。我认为这一切都回到了 Reed 所说的需要 MEF 来创造一切。所以现在,我有一个需要使用我的 CandySettings 的 XML 阅读器类,但即使它的 ICandySettings 属性具有 [Import] 属性,它也不会被导入。首先我发现 [Import] 对静力学不起作用,所以我改变了它。但在那之后它仍然没有用。我认为这是因为我手动创建了 XML 阅读器对象,而 MEF 希望我做的是 [导入] XML 阅读器...这意味着我现在也必须有一个接口(interface)。

这几乎就像使用 IoC(或至少对于 MEF)一样,这是一个要么全有要么全无的事情。您不能随意在这里或那里使用它,因为最终您想要将属性注入(inject)的任何类也需要由 MEF 创建。

如有错误请指正!


原帖

嗯,还不算太糟。 :) 但在 Reed 指出我可以将 MEF 作为 IoC 的潜在替代品后,我确实有疑问(到目前为止它看起来确实不错)。

考虑以下模型: alt text http://bit.ly/9W0sHt

如您所见,我有一个应用程序,这个应用程序使用了插件(哎呀,错过了那个关联!)。应用程序和插件都需要使用 CandySettings 类型的对象,该对象位于另一个程序集中。

我首先尝试在 MEF 中使用 ComposeParts 方法,但唯一能让它起作用的方法是在插件代码中执行类似的操作。

var container = new CompositionContainer();
container.ComposeParts(this, new CandySettings());

但这没有任何意义,因为我为什么要在插件中创建 CandySettings 的实例?它应该在应用程序中。但是如果我把它放在应用程序代码中,那么插件就不会神奇地弄清楚如何获取 ICandySettings,即使我在插件中使用 [Import],在 CandySettings 中使用 [Export]。 编辑(可能是因为我应该从应用程序调用 ComposeParts() 然后将其传递给插件?)

我这样做的方法是使用 MEF 的 DirectoryCatalog,因为这允许插件在构造时扫描当前文件夹中的所有程序集并自动导入所有标有 [导入]属性。所以它看起来像这样,并且可能在每个插件中:

var catalog = new DirectoryCatalog(".");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);

这非常有效,但我不禁认为这不是 MEF 的预期用途?

最佳答案

这里的“技巧”是您想让 MEF 为您创建插件。

执行此操作的方法是让您的应用程序自行组合,并指定插件类型:

class PluginRepository
{
[ImportMany(typeof(IPlugin))]
IEnumerable<IPlugin> Plugins { get; set; }
}

如果您这样做,并让 MEF 编写您的“存储库”类,MEF 将构造对象。然后它会在构建它们时自动组合它们,因此 ICandySettings 将在您没有任何干预的情况下组合。

如果 MEF 没有为您构造对象,您只需要手动“组合”对象。

关于c# - MEF = 可能会遇到挫折?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2655209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com