.net 使用MEF导入默认构造函数中的对象

0g0grzrc  于 2023-03-04  发布在  .NET
关注(0)|答案(1)|浏览(117)

我真的认为这还没有被问到,也不确定以前是否有人遇到过这个问题
所以我和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);
    }
}
osh3o9ms

osh3o9ms1#

您可能希望自己创建底层CompositionContainer并提供一些静态方法来从中检索对象。您也可以直接公开容器,以便可以从任何位置访问SatisfyImportsOnce()、GetExport()等方法。
注意:你可以去掉执行导入的ctor,直接用[ImportMany]修饰你的私有字段,这样在创建一个新的T()之后,你就可以调用yourContainer.SatisfyImportsOnce(your_T_instance)。
有关详细信息,请参见msdn上的示例。

相关问题