gpt4 book ai didi

c# - MEF 是孤注一掷的事情吗?

转载 作者:行者123 更新时间:2023-11-30 21:21:30 28 4
gpt4 key购买 nike

我最近有几个关于 MEF 的问题,但最重要的是——它真的像看起来那样孤注一掷吗?

我的基本应用程序结构只是一个应用程序、几个旨在成为单例的共享库和几个不同的插件(可能实现不同的接口(interface))。应用加载插件,应用和所有插件都需要访问共享库。

我在 MEF 的第一次尝试相当成功,尽管一路上我犯了一些愚蠢的错误,因为我尝试了很多不同的事情,有时我会感到困惑。但最后,昨晚我让我的小型测试应用程序与 MEF、一些共享库和一个插件一起运行。

现在我要转到我已经描述过的目标应用程序。有点担心的是多插件部分。

我现有的应用程序已经通过使用反射支持具有不同接口(interface)的多个插件。我需要能够唯一地标识每个插件,以便用户可以选择一个插件并获得该插件公开的预期行为。问题是我还不知道该怎么做......但这是另一个问题的主题。

理想情况下,我能够使用我现有的插件加载器并按原样使用它,同时依靠 MEF 来执行共享库解析。问题是,我似乎无法让 MEF 加载它们(即调用 ComposeParts() 时出现 CompositionException),除非我还使用 MEF 加载插件。如果我这样做,那么...然后我需要知道如何在它们加载时跟踪它们,以便用户可以从插件列表中选择一个。

您在尝试混合搭配这些方法方面有什么经验?

最佳答案

MEF 旨在让您轻松加载插件程序集。如果您可以控制插件(我的意思是您可以添加 MEF 导出属性),那么就没有必要保留您自己的使用反射的插件加载器。 MEF 会为您完成这一切。

话虽这么说,“混合和匹配”MEF 与其他技术当然是可能的。听起来你的问题是,如果你使用自己的插件加载器,你不会将这些插件添加到 MEF 容器中。结果,你得到一个 CompositionException对于尝试导入所选插件的部分。

要将您使用自己的代码加载的插件添加到 MEF 容器中,您可以使用 ComposeExportedValue像这样:

container.ComposeExportedValue<IPlugin>(selectedPlugin);

编辑:我明白你现在所说的“全有或全无”的意思了。您的问题是,为了能够使用 MEF 导入零件,您还需要使用 MEF 构造对象。然后,此问题会级联到通常创建该对象的对象等,一直到应用程序根目录。

为了避免这种“全有或全无”的效果,您可以通过将 MEF 容器公开为全局变量(即静态字段)来做出妥协。这样,类就可以访问 MEF 容器并从中提取导出,例如调用Program.Container.GetExportedValue<MyDependency>()在构造函数中。

edit2:如果您有一个不是由 MEF 构造的对象,那么有两种方法可以将它添加到容器中。

首先是调用container.ComposeExportedValue<IMyContractType>(myObject); .

第二种是在属性 getter 中返回对象,然后用 [Export(typeof(SomeType))] 属性标记属性本身。

关于c# - MEF 是孤注一掷的事情吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675954/

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