[英]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.