2017-07-28 24 views
1

誰能幫我擁有自營ImportingConstructor在MEF屬性與相關的例子,以及何時使用? [Import(AllowDefault = true)]有什麼用?MEF中的Import和ImportingConstructor屬性之間的區別與正確的示例?

從我的MEF的理解:

導出屬性上的類型T的類定義,其中T是界面並創建要在參考變量定義如下面

[Export(typeof(ICalculator))] 
class MySimpleCalculator : ICalculator 
{ 
    // Implement the interface 
} 

class MyMainClass 
{ 
    // MEF engine creates an instance as Export attribute is defined 
    // on MySimpleCalculator 

    [Import(typeof(ICalculator))] 
    public ICalculator calculator; 
} 
該類導入屬性的一個實例

如果類型T的多個出口在給定的組件被定義那麼我們可以使用ImportMany屬性。

所以,現在任何人都可以解釋時,在構造函數中使用導入和ImportingConstructor也AllowDefault屬性?

這將是巨大的,如果有人能更好的例子解釋。

任何幫助,將不勝感激。 感謝

回答

1

ImportingConstructor

您導入的示例代碼/輸出部分,如果MyMainClass是越來越組成,隱含參數的構造函數的調用方式,然後MySimpleCalculator實例分配給calculator領域。

現在讓我們假設你想要只有只讀字段/只讀屬性,否則需要訪問構造函數中的ICalculator,您需要將它傳遞給構造函數,而不是稍後分配給該字段:

public interface ICalculator 
{ 
    bool Quack { get; } 
} 

[Export(typeof(ICalculator))] 
public class MySimpleCalculator : ICalculator 
{ 
    public bool Quack => true; 
} 

[Export] 
public class MyMainClass 
{ 
    public ICalculator Calculator { get; } 
    public string Blah { get; } 

    [ImportingConstructor] 
    public MyMainClass(ICalculator calculator) 
    { 
     Calculator = calculator; // assign readonly property 
     Blah = calculator.Quack ? "Foo" : "Bar"; // do something based on calculator 
    } 
} 

現在,構造函數的參數被隱含地導入並且滿足相應的導出。

AllowDefault

如果[導入]的東西,這東西就必須提供或組成失敗。

如果你[導入(AllowDefault = true)]的東西,如果沒有相應的導出,組合將不會失敗,但你得到null/false/0作爲導入的值。

順便說一句:對不起,稍微諷刺,但答案可能也有RTFM

相關問題