C# 子类中的MEF导入对象为空

C# 子类中的MEF导入对象为空,c#,.net,mef,C#,.net,Mef,我面临一个奇怪的问题,在类中可以很好地导入对象。 如果我从第一个类创建另一个类的实例,然后尝试在子类中导入相同的对象,导入总是失败 头等舱: public class Foo { [Import] private SomeExportedType foobar; public Foo() { foobar.Test(); // Works just fine Bar bar = new Bar(); bar.Test(

我面临一个奇怪的问题,在类中可以很好地导入对象。 如果我从第一个类创建另一个类的实例,然后尝试在子类中导入相同的对象,导入总是失败

头等舱:

public class Foo {

    [Import]
    private SomeExportedType foobar;

    public Foo() {
        foobar.Test(); // Works just fine

        Bar bar = new Bar();
        bar.Test();
    }
}
二等舱:

public class Bar {

    [Import]
    private SomeExportedType foobar;

    public void Test() {
        foobar.Test(); // This fails because foobar is NULL
    }
}
当然,所有这些都是伪代码,但它正确地反映了我的代码是如何构建的。
为什么子类中的导入失败?

通过手动更新Bar类,您绕过了MEF,因此无法满足导入要求,您应该允许MEF负责更新类

public class Foo {

    [Import]
    private SomeExportedType foobar;

    [Import]
    private Bar bar;

    public Foo() {
        foobar.Test(); // Works just 

        bar.Test(); // Should also work fine.
    }
}

同时尝试导入Bar类的实例。。这样,它将由MEF实例化,并满足导入要求。

如何实例化“Foo”类?如果您只是使用类的构造函数新建一个类,则不会满足导入。。。我讨厌财产注入的部分原因实际上。。。没有准确地声明它的依赖关系。正如我在对您的答案的评论中提到的,“Foo”是由MEF实例化的。就是这样。我以前看过关于这方面的评论,但我认为只要Foo是由MEF实例化的,那么即使是由Foo实例化,Bar也会保持MEF连接。但显然不是。我更改了实现,使Bar导出它自己,Foo导入它,然后它像一个符咒一样工作。@GTHvidsten这是我在“属性注入”中遇到的问题之一,我觉得它隐藏了类需要的依赖项。我倾向于使用“ImportingConstructor”属性,它允许我在需要时手动更新类。