2011-08-26 31 views
2

我正在管理通过共享合同共享组件的复杂项目。有几个主机和许多这些共享插件。如何在MEF中支持双接口的版本?

为了简化兼容性和部署,我们将就两组接口达成一致意见:v(latest)和v(latest-1)。不知何故,每个主机必须支持这两个集合。

理想情况下,我想通过v(最新)合同开发人员负责的一些自定义适配器代码来编写主机,以便仅针对最新v(最新),并且使旧组件适应透明。

Host importing v(Latest) -> Adapter -> Plugin export v(Latest-1)

有什么办法,我可以在MEF实现这一目标?我对它的可扩展性模型还不太熟悉,我以前从未使用它。

回答

1

而不是做所有插件的ImportMany,你可以导入一个IPluginProvider。然后,您可以将必要的适配器逻辑放入插件提供程序实现中。例如:

[Export(typeof(IPluginProvider))] 
public PluginProvider : IPluginProvider 
{ 
    [ImportMany] 
    public IEnumerable<IPlugin2> Plugins { get; set; } 

    [ImportMany] 
    public IEnumerable<IPlugin1> LegacyPlugins { get; set; } 

    public IEnumerable<IPlugin2> GetPlugins() 
    { 
     var adaptedPlugins = this.LegacyPlugins.Select(x => new Adapter(x)); 
     return this.Plugins.Concat(adaptedPlugins); 
    } 
} 

此选项只有当你有过插件消费者控制,这样就可以改变他们进口IPluginProvider工作。如果没有,您需要设置一个ExportProvider实现的MEF容器,它在某种程度上意识到适配器。

MEF并没有像盒子那样出现,所以我推出了我自己的实验ExportManyProvider。它允许您使用ExportMany属性导出上述适配器服务。有关如何使用它的示例,请参阅测试代码。