簡體   English   中英

使用MEF在默認構造函數中導入對象

[英]Importing objects in a default constructor using MEF

我真的認為這尚未被問到,並且不確定是否有人遇到過此問題

因此,我正在與MEF合作,並開設了如下課程-

[Export]
public class MyClass : IBase
{

private IEnumberable<IMyAddin> _theAddin;

//Default constructor will NOT be
//used because the ImportingConstructor
//attribute is present.
public MyClass() 
{ 
    foreach (var addin in _theAddin)
        DoSomeVeryImportantWork(addin);
}

//This constructor will be used.
//An import with contract type IMyAddin is 
//declared automatically.
[ImportingConstructor] 
public MyClass([ImportMany]IEnumberable<IMyAddin> MyAddin;) : this()
{
    _theAddin = MyAddin;
}

}

我在下面的某個地方有一種方法-

T GetById<T>(Guid id) where T:IBase, new()
{
    var x = new T(); 
    //Do some processing
    return x
}

問題是,由於我正在執行新的T(),因此默認構造函數對_TheAddin一無所知,並且為null。

有人遇到過嗎? 如果問題不清楚,請告訴我,我可以提供更多詳細信息。

我嘗試從默認構造函數中刪除[ImportingConstructor],但是它不起作用。 如何填充_theAddin?

提前致謝!

編輯:我也嘗試了如下,不起作用-

[Export]
public class MyClass : IBase
{

[ImportMany]
private IEnumberable<IMyAddin> _theAddin;

//Default constructor will NOT be
//used because the ImportingConstructor
//attribute is present.
public MyClass() 
{ 
    foreach (var addin in _theAddin)
        DoSomeVeryImportantWork(addin);
}


}

您可能想要自己創建基礎的CompositionContainer並提供一些靜態方法來從中檢索對象。 您也可以直接公開容器,以便可以從任何地方訪問SatisfyImportsOnce(),GetExport()等方法。

注意:您可以直接使用[ImportMany]擺脫進行導入和裝飾私有字段的ctor。 這樣,在創建新的T()之后,您可以調用yourContainer.SatisfyImportsOnce(your_T_instance)。

有關詳細信息,請參見msdn上的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM