Interface 如何在MEF中支持接口的双版本?

Interface 如何在MEF中支持接口的双版本?,interface,mef,adapter,composition,Interface,Mef,Adapter,Composition,我正在管理一个通过共享合同共享组件的复杂项目。有几个主机和许多共享插件 为了简化兼容性和部署,我们将商定两组接口:v(最新)和v(最新-1)。无论如何,每个主机都必须支持这两个集 理想情况下,我希望将主机编写为只针对最新的v(latest),并通过v(latest)合同开发人员负责的一些自定义适配器代码透明地调整旧组件 主机导入v(最新)->适配器->插件导出v(最新-1) 我有没有办法在MEF中实现这一点?我还不太熟悉它的扩展性模型,我以前从未使用过它。不必导入所有插件的导入,只需导入IPlu

我正在管理一个通过共享合同共享组件的复杂项目。有几个主机和许多共享插件

为了简化兼容性和部署,我们将商定两组接口:v(最新)和v(最新-1)。无论如何,每个主机都必须支持这两个集

理想情况下,我希望将主机编写为只针对最新的v(latest),并通过v(latest)合同开发人员负责的一些自定义适配器代码透明地调整旧组件

主机导入v(最新)->适配器->插件导出v(最新-1)


我有没有办法在MEF中实现这一点?我还不太熟悉它的扩展性模型,我以前从未使用过它。

不必导入所有插件的
导入,只需导入
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);
   }
}
[导出(typeof(IPluginProvider))]
公共插件提供程序:IPluginProvider
{
[进口数量]
公共IEnumerable插件{get;set;}
[进口数量]
公共IEnumerable豆类插件{get;set;}
公共IEnumerable GetPlugins()
{
var adaptedPlugins=this.LegacyPlugins.Select(x=>newadapter(x));
返回this.Plugins.Concat(adaptedPlugins);
}
}
此选项仅在您控制插件使用者时有效,以便您可以将其更改为导入
IPluginProvider
。如果没有,您将需要使用
ExportProvider
实现来设置MEF容器,该实现以某种方式知道适配器

MEF没有现成的东西,所以我自己做了实验。它允许您使用
ExportMany
属性导出上述适配器服务。有关如何使用它的示例,请参见测试代码