對於本例,您可以假設頂層導入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");
}
您的回答很有用,但與我的問題無關。您的主題/鏈接通過註冊類型來減少容器中的零件數量。我修改了我的問題和代碼示例以更好地說明我的問題。我需要在沒有導出屬性的類中(不屬於導入鏈)滿足導入。 – aidesigner