0

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

那么,为什么我需要打扰进口装饰呢?我知道 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;
    }

我错过了什么或缺乏理解吗?请帮我理解。

4

1 回答 1

2

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

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

于 2013-05-10T10:26:08.620 回答