【问题标题】:Managed Extensibility Framework (MEF), why are Imports needed?托管可扩展性框架 (MEF),为什么需要导入?
【发布时间】:2013-05-10 07:55:48
【问题描述】:

我想知道 Import/ImportMany 装饰有什么用?我使用 MEF 并通过 CompositionContainer 管理一切。我使用派生自 ExportAttribute 的自定义 MetaDataAttribute 修饰了导出。当我尝试访问插件实例时,我可以通过Container.GetExports<T, IMetaDataAttribute>() 懒惰地访问元数据和插件实现。

那么,为什么我需要使用 Import 装饰?我知道 MEF 的核心是 CompositionContainer,这才是我真正应该关心的。但是网络上的大多数示例都通过 Import 修饰的对象实例。为什么会这样?它们提供了什么附加值?

以下是我如何访问元数据和实际插件的示例:

    public static IEnumerable<IPluginAttributeView> GetMetaData<T>()
    {
        return Container.GetExports<T, IPluginAttributeView>().Select(e => e.Metadata);
    }

    public static T GetPlugin<T>(string pluginName) where T : class
    {
        var plugins = Container.GetExports<T, IPluginAttributeView>();
        var pluginByName = plugins.Where(e => e.Metadata.PluginName.Equals(pluginName)).FirstOrDefault();

        return pluginByName.Value;
    }

我是否遗漏了什么或缺乏理解?请帮我理解。

【问题讨论】:

    标签: c# plugins dependency-injection inversion-of-control mef


    【解决方案1】:

    导入属性(及其在 MEF2 中的等效 RegistrationBuilder 方法)非常有用,因为它们为您提供了自动依赖注入。容器会为你处理这个。您可以使用导出属性装饰的许多类型和使用导入属性之一装饰的成员,并在需要时让容器组合它们。因此,您只需使用容器来获取没有其他类型正在导入的导出。其余的都由 MEF 为您处理。如果您避免导入属性,那么您将不得不自己注入所有依赖项。

    如果您查看大多数 MEF 示例,您会注意到其中大多数都广泛使用导入属性。有些人使用 MEF,甚至不知道 GetExportXXX 方法是由 CompositionContainer 提供的。当然,由您决定最适合您的应用程序的内容。在您的情况下(插件管理器),GetExports 方法可能就足够了。如果您决定在插件之间添加依赖关系,那么导入属性将变得非常有价值,并且您的插件管理器会更加简单。对于插件管理器来说,MEF 的另一个不错的特性是重组,据我所知,它只能通过导入属性(或 MEF2 的RegistrationBuilder)获得。这可以为您的插件感知应用程序增加巨大的价值。无论哪种方式,您仍然拥有 MEF 应该提供的可扩展性功能。

    【讨论】:

    • 这就是我感到困惑的原因。鉴于有人知道GetExport,我看不到使用 Imports 的任何优势。相反,Imports 引入了额外的代码中断机会和额外的类。此外,当在与容器相同的类中使用导入时,无法将包装类设置为静态,这基本上意味着必须传递插件管理器的引用而不是使用静态类。当然,导入可以放在一个单独的类中并实例化并作为 ref 存储在静态 PluginManager 类中。无论如何,我仍然看不到 Imports 对我有什么帮助。
    • 我明白你的观点是重新添加插件之间的依赖关系,我想这就是将 Unity 和 MEF 之类的东西结合起来派上用场的地方。谢谢你的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多