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

时间:2011-08-26 09:51:44

标签: interface mef adapter composition

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

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

理想情况下,我想编写主机以定位最新的v(最新版本),并通过v(最新)合同开发人员负责的一些自定义适配器代码对旧组件进行透明调整。< / p>

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

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

1 个答案:

答案 0 :(得分: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属性导出上述适配器服务。有关如何使用它的示例,请参阅测试代码。