托管可扩展性框架(MEF),为什么需要导入
本文关键字:为什么 导入 MEF 可扩展性 框架 | 更新日期: 2023-09-27 18:13:03
我想知道Import/ImportMany装饰有什么用?我玩了MEF,并通过CompositionContainer管理一切。我用一个自定义的MetaDataAttribute来修饰导出,这个MetaDataAttribute派生自ExportAttribute。当我尝试访问插件实例时,我可以通过Container.GetExports<T, IMetaDataAttribute>()
惰性地访问元数据和插件实现。
那么,为什么我需要导入装饰呢?我理解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;
}
我错过了什么还是缺乏理解?请帮助我理解。
import属性(以及MEF2中等价的RegistrationBuilder
方法)非常有用,因为它们为您提供了自动依赖注入。容器会帮你处理。您可以使用导出属性装饰许多类型,并使用其中一个导入属性装饰成员,并让容器在需要时组合它们。因此,您只需使用容器来获取没有其他类型导入的导出。其余的都由MEF为您处理。如果您避免使用import属性,那么您将不得不自己注入所有依赖项。
如果您看一下大多数MEF示例,您会注意到它们中的大多数都广泛地使用了import属性。有些人使用MEF,甚至不知道GetExportXXX
方法是由CompositionContainer
提供的。当然,什么最适合您的应用程序取决于您自己。在您的情况下(插件管理器),GetExports
方法可能就足够了。如果您决定在插件之间添加依赖项,那么导入属性将变得非常有价值,您的插件管理器也会简单得多。对于插件管理器,MEF的另一个很好的特性是重组,据我所知,它只能通过导入属性(或MEF2的RegistrationBuilder
)获得。这可以为您的插件感知应用程序增加很大的价值。无论哪种方式,您仍然拥有MEF应该提供的可扩展性功能。