C# MEF:[导入]空引用

C# MEF:[导入]空引用,c#,.net,mef,caliburn.micro,C#,.net,Mef,Caliburn.micro,我在我的一个项目中使用Caliburn.Micro和MEF。我可以在根视图模型中获得导入。但是,如果我想将导入到其他一些类中,它将不起作用。例如: [Export] public class A { [Import] static ILogger logger; public static void SomeMethod() { logger.Log("foobar"); } } 而且 [Export(typeof(ILogger))]

我在我的一个项目中使用Caliburn.Micro和MEF。我可以在根视图模型中获得导入。但是,如果我想将导入到其他一些类中,它将不起作用。例如:

[Export]
public class A
{
    [Import]
    static ILogger logger;

    public static void SomeMethod()
    {
        logger.Log("foobar");
    }
}
而且

[Export(typeof(ILogger))]
public class FileLogger : ILogger
{
    public void Log()
    {
        //some implementations
    }
}
当我运行应用程序时,logger从未设置或仅等于null

奇怪的是,如果我将导入添加到根viewmodel中,如下所示,并在那里设置断点,它会以某种方式工作:

[Import]
public ILogger logger {get; set;}

但是,当我按F5继续时,logger在类A中显示为null。我想知道为什么logger的值设置为null以及在哪个位置。

您需要使用
CompositionContainer
组合或满足对象的导入

A a = new A();
compositionContainer.ComposeParts(a);

否则,您可以使用
CompositionContainer.GetExportXXXX
方法之一。通过这种方式,MEF将为您创建和合成对象。

您需要使用
合成容器来合成或满足对象的导入

A a = new A();
compositionContainer.ComposeParts(a);

否则,您可以使用
CompositionContainer.GetExportXXXX
方法之一。通过这种方式,MEF将为您创建和合成对象。

您是自己创建对象还是调用CompositionContainer.GetExport方法之一?@Panosrontgiannis实际上是我自己创建的。您是自己创建对象还是调用CompositionContainer.GetExport方法之一?@Panosrontgiannis实际上是我创建的我自己,谢谢你的回答。不幸的是,它仍然不起作用。似乎MEF无法解析导入。@IsilmëOrphousV您是否使用与组成根viewmodel相同的CompositionContainer?是。我是在AppBootstrapper中做的,所以它肯定是同一个容器。谢谢你的回答。不幸的是,它仍然不起作用。似乎MEF无法解析导入。@IsilmëOrphousV您是否使用与组成根viewmodel相同的CompositionContainer?是。我是在AppBootstrapper中做的,所以它肯定是同一个容器。