與MEF

2010-06-02 26 views
2

我在去年的應用程序加載,使用MEF加載插件多插件實例去就好了,但現在我遇到一個新的問題。我有一個解決方案,我在這個問題的最後解釋,但我正在尋找其他方法來做到這一點。與MEF

假設我有一個名爲ApplianceInterface的接口。我也有兩個從ApplianceInterface繼承的插件,我們稱它們爲Blender和Processor。現在,我想在我的應用程序中使用多個攪拌機和處理器,但我不確定如何正確實例化它們。

之前,我只是簡單地使用ImportMany屬性,並在調用ComposeParts時,我的應用程序將加載Blender和Processor。例如:

[ImportMany(typeof(ApplianceInterface))] 
private IEnumerable<ApplianceInterface> Appliances { get; set; } 

和我的攪拌機和處理器的插件將可以歸結如下:

[PartCreationPolicy(CreationPolicy.NonShared)] 
[Export(typeof(MyInterface)] 
public class Blender : ApplianceInterface 
{ 
    ... 
} 

,但是這是什麼結束了做對我來說是填充一個攪拌機和一個處理器設備。我需要能夠創建任意數量的Blender和Processor對象。現在

,從文檔我明白[PartCreationPolicy(CreationPolicy.NonShared)]是什麼讓MEF每次創建新實例,但有一個類似的「神奇」的方式來創建一個使用MEF的一些實例的具體數量?到現在爲止,我已經依靠[Import][ImportMany]解決的組件。

是我唯一的選擇使用全局容器,然後使用GetExportedValue <>手動解析導出?我曾嘗試GetExportedValue <>和實施確實對我的工作很好,但我只是好奇,如果有更好的,更接受的方式來做到這一點。

UPDATE

我只是實現了一個很大的錯誤,並GetExportedValue <>是不是我真正想要的。我遍歷IEnumerable,當我得到一個匹配(基於一些參數),我想實例化一個新的對象的當前值。 GetExportedValue <>結束的情況下沒有在那裏我有兩個不同的插件,這兩個出口ApplianceInterface。

我覺得我的問題現在是不同的,並且可能是一個特定於C#的問題。

回答

2

ExportFactory是您在找的東西,但它目前僅在Silverlight中可用。下面是一個解釋如何在桌面上處理這個問題的問題:Multiple Instances of a single MEF DLL

+0

謝謝,這是一個有趣的方法。因此,使用MEF來解析類工廠的單個實例,然後可以創建特定類型的多個實例。我認爲它會正常工作,但確實需要更多的實現,只需調用GetExportedValue。 我的設備創建所有發生在管理所有在廚房電器的一個對象,所以MEF容器只需要在一個組件。但是,如果事情發生變化,我需要在其他地方解決,我認爲你的建議絕對是一種方式。 – Dave 2010-06-03 16:32:03

+0

它看起來像這樣的作品對我的問題之前,我意識到在我的思想的根本缺陷(或缺乏)。我可以擴展它來處理我的新問題,但這不是最好的解決方案。當我有兩個ApplianceInterfaces時,我可以將一個字符串傳遞給類工廠以獲取特定類型的ApplianceInterface,因爲可能有多個插件公開此接口,但我需要能夠創建派生類的實例。有必要用C#魔法做到這一點,但我還沒有弄明白。 – Dave 2010-06-18 16:24:48