2011-12-07 54 views
0

我有以下類別:控制哪一部分是由在MEF

public class Foo 
{ 
    [Import] 
    public IFirstInterface firstImport; 

    [Import] 
    public ISecondInterface secondImport; 

    // ... 
} 

public class A : ISecondInterface {} 

public class B : ISecondInterface {} 

調用

var foo = compositionContainer.GetExportedValue<Foo>(); 

時指定閹我想用A級,我想能夠在課堂上酒吧,或B.

我知道,我可以在GetExportedvalue方法中指定一個合約名稱。但據我瞭解,這意味着有兩個班Foo。我想重用相同的類,但控制使用哪個類(A或B)來滿足ISecondInterface依賴性。 「

編輯: 」什麼規則將決定您是否使用A類或B類?「

答: Foo由wcf服務調用。 A類和B類的不同之處在於它們正在處理不同的實體。這些實體具有不同的字段,不能以相同的方式查詢。

我的課程不是英語,但我會嘗試翻譯成比Foo和Bar更有意義的術語。

Foo可能是一個RecordAssigner。 RecordAssigner將記錄分配給用戶。這樣做的邏輯包含在這個類中。 ISecondInterface是與記錄一起工作的數據層類的接口。

它的實現公開方法工作在不同種類的記錄。雖然這兩種記錄需求都可以公開必要的方法,但它們在數據級別上的操作方式不同。

在服務級別,我希望能夠在不復制RecordAssigner中的所有代碼的情況下擁有稱爲 AssignRecordTypeA和AssignRecordTypeB的方法。

+0

您示例中的第一個導入似乎與該問題無關,這讓我困惑了一陣子。 –

回答

1

有什麼規則可以決定您使用A級還是B級?您可以爲MEF導出編寫自己的解析器。

本博客文章http://randomactsofcoding.blogspot.com/2010/01/configurable-type-catalog-for-mef.html提到了一個辦法,還有一些其他的,如果你搜索「MEF定製出口供應商」或「MEF定義目錄」

編輯,你可以找到: 您的場景提醒我剛纔和一些同事談了一點點。在我看來,MEF是針對應用程序的「擴展」,而不是依賴關係。你看起來更像依賴關係。所以你最好使用IoC容器來管理你的依賴關係。您可以使用不同的鍵注入多個ISecondInterface實例,然後選擇要使用的實例。

如果你覺得MEF是通過改變

public class Foo 
{ 
    [Import] 
    public IFirstInterface firstImport; 

    [ImportMany] 
    public Collection<ISecondInterface> secondImport; 

    // ... 
} 

,然後決定使用哪一個更適合你的要求,你仍然可以做到這一點。儘管如此,具有處理與兩個不同存儲庫對話的兩個不同實體的一個服務的情況值得商榷。 如果你有一些共同的邏輯,你可以重構它,但是最好有兩個不同的服務,每個服務都需要它的工作依賴。

+0

我在你的問題中添加了一個awnser:有什麼規則可以決定你使用A類還是B類?在編輯我的文章。 – Gilles

1

我不能立即想到一種方法來在MEF中執行此操作,而無需創建任何其他類。我能想到的最好的方法是創建Foo的子類別,其中有不同的[Import]規範。

AutoFac或其它容器(見exampleNinject(見contextual binding)可以給你更細粒度的控制。