2011-09-01 96 views
2

對於本例,您可以假設頂層導入ClassA。只要你輸入所有東西(即ClassX),MEF似乎工作得很好。通常您不需要導入,因爲classB位於相同的命名空間/文件中。因此,導入鏈現在被破壞,myLog導入從不組成。在我的例子中,ClassB試圖導入一個Logger服務,這幾乎是所有類可能需要的。打破.NET MEF導入鏈

如果有的話,哪個是最好的/最好的MEF解決方案?

1)一旦導入鏈被破壞,不要再次使用導入。相反,你必須開始創建/傳遞所有類型給構造函數(即新的ClassB(myLog))。這個例子在這個例子中有效,但是如果鏈中沒有使用參數的中間類,這很麻煩。

2)利用System命名空間中的IServiceLocator導入ClassB。據我所知,ServiceLocator(例如Prism Framework)僅用於抽象依賴注入機制。對於這個例子,如果ClassB可以導入IServiceLocator,那麼它可能已經導入了ILogger。

3)回到頂層調用ComposeParts(ClassB)。爲了防止頂層依賴於ClassB,我可以讓classB實現一個接口(IComposeMe),它是頂層導入的。然後,頂層會爲所有IComposeMe導入的容器上的ComposeParts。我不相信這是預期的解決方案,因爲它沒有在MEF框架文檔中描述或使用。

4)其實我的想法,請幫助...

class ClassA { 

    // Imports within ClassX will get composed 
    [Import] 
    ClassX myClassX; 

    // Imports within ClassB will NOT be composed! 
    var myClassB = new ClassB 
} 

class ClassB { 

    // Fails because ClassB is never Composed 
    [Import] 
    ILogger myLog; 

    myLog.Display("Hello World"); 
} 

[Export] 
class ClassX { 

    // Works - Imports are satified when ClassX imported 
    [Import] 
    ILogger myLog; 

    myLog.Display("Hello World"); 
} 

回答

0

當然,你可以註冊的地方要在導入/導出其類型,而不必掃描整個組裝。 我不知道這是否會幫助,但這裏有一個鏈接我google搜索了一下後發現: http://blogs.microsoft.co.il/blogs/zuker/archive/2010/10/17/mef-runtime-type-catalog-support-multi-registrations-in-runtime.aspx

+0

您的回答很有用,但與我的問題無關。您的主題/鏈接通過註冊類型來減少容器中的零件數量。我修改了我的問題和代碼示例以更好地說明我的問題。我需要在沒有導出屬性的類中(不屬於導入鏈)滿足導入。 – aidesigner

1

首選的方法,如果你遵循依賴注入模式? 不要打破進口鏈。您應該在應用程序中將組件連接在一起時有一個組合的根。組件本身不應該關心獲取它們的依賴關係。

在實踐中,您必須處理現有的代碼(以及其他開發人員對DI的懷疑),因此您不能始終執行依賴注入「一路下來」。在這些情況下,您可以將容器暴露爲全局變量,並從那裏提取必要的依賴關係。

將容器公開爲全局實質上是Service Locator模式。但它有一些disadvantages