我真的认为这还没有被问到,也不确定以前是否有人遇到过这个问题
所以我和MEF一起工作,有一个如下的类-
[Export]
public class MyClass : IBase
{
private IEnumerable<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);
}
}
1条答案
按热度按时间osh3o9ms1#
您可能希望自己创建底层CompositionContainer并提供一些静态方法来从中检索对象。您也可以直接公开容器,以便可以从任何位置访问SatisfyImportsOnce()、GetExport()等方法。
注意:你可以去掉执行导入的ctor,直接用[ImportMany]修饰你的私有字段,这样在创建一个新的T()之后,你就可以调用yourContainer.SatisfyImportsOnce(your_T_instance)。
有关详细信息,请参见msdn上的示例。