2013-05-10 76 views
0

我想知道使用Import/ImportMany装饰物有什么好处?我和MEF一起玩,并通过CompositionContainer管理所有事情。我使用派生自ExportAttribute的自定义MetaDataAttribute来装饰出口。当我尝试访问插件实例时,我可以通过Container.GetExports<T, IMetaDataAttribute>()懒洋洋地访问元数据和插件实现。托管扩展性框架(MEF),为什么需要导入?

那么,我为什么需要进口的装饰打扰?我明白MEF的核心是CompositionContainer,而这正是我应该关心的。但是网上的大多数例子都通过导入装饰对象实例。为什么是这样,他们提供什么附加价值?

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

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; 
    } 

我缺少的东西或缺乏了解?请帮助我理解。因为他们为您提供自动的依赖注入

回答

2

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

如果你看看大多数的MEF的例子在那里你会注意到,他们大多使用进口大量属性。有些人使用MEF,甚至不知道CompositionContainer提供的GetExportXXX方法。当然,您需要决定什么最适合您的应用程序。在你的情况下(插件管理器),GetExports方法可能就足够了。如果您决定添加插件之间的依赖关系,那么导入属性将变得非常有价值,并且您的插件管理器将变得更加简单。 MEF对插件管理器另一个不错的功能是重排,这是据我所知,仅可通过导入属性(或MEF2的RegistrationBuilder)。这可以为您的插件感知应用程序增加很大的价值。无论哪种方式,您仍然有MEF应该提供的可扩展性功能。

+0

这就是为什么我很困惑。鉴于人们知道'GetExport',我没有看到使用Imports的任何优势。相反,Imports会引入额外的代码中断和其他类的机会。另外,在与Container相同的类中使用导入时,无法将包装类设置为静态,这基本上意味着必须传递插件管理器的引用而不是使用静态类。当然,导入可以放在一个单独的类中,并在静态PluginManager类中实例化并存储为ref。在任何情况下,我仍然看不到Imports如何帮助我。 – 2013-05-10 12:18:48

+0

我看到你的观点重新加入了插件之间的依赖关系,我想这就是将Unity和MEF这样的东西结合起来的地方。谢谢你的解释 – 2013-05-10 12:21:47

相关问题