2011-08-26 30 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屬性導出上述適配器服務。有關如何使用它的示例,請參閱測試代碼。