C# MEF导入为空

C# MEF导入为空,c#,dependency-injection,null,mef,C#,Dependency Injection,Null,Mef,我有一个导入不起作用-对象为空。最初,这是一个重要问题,但我将其简化为一个重要问题,以尝试确定问题,但我没有成功地这样做 我浏览了这个网站和谷歌,并遵循了主要观点: 不要自己实例化这个类,让MEF来做,否则调用container.getExport()-仍然不起作用 在包含[Import]属性的类上放置[Export],否则容器组合过程(调试时确认)不会将其作为一个部分拾取 我的代码设置如下(为了紧凑起见简化): 组装1 public class MyBootstrapper { /

我有一个导入不起作用-对象为空。最初,这是一个重要问题,但我将其简化为一个重要问题,以尝试确定问题,但我没有成功地这样做

我浏览了这个网站和谷歌,并遵循了主要观点:

  • 不要自己实例化这个类,让MEF来做,否则调用container.getExport()-仍然不起作用
  • 在包含[Import]属性的类上放置[Export],否则容器组合过程(调试时确认)不会将其作为一个部分拾取
我的代码设置如下(为了紧凑起见简化):

组装1

public class MyBootstrapper
{
    //Automatically called by ExcelDna library, I do not instantiate this class
    public void AutoOpen()
    {
        var ac1 = new AssemblyCatalog(typeof(XLHandler).Assembly);
        var ac2 = new AssemblyCatalog(typeof(MyComponent).Assembly);

        var agc = new AggregateCatalog();
        agc.Catalogs.Add(ac1);
        agc.Catalogs.Add(ac2);

        var cc = new CompositionContainer(agc);

        try
        {
            cc.ComposeParts(this);
        }
        catch (CompositionException exception) {}
    }
}

[Export]
public class XLHandler
{
    [Import(typeof(IMyComponent))]
    public IMyComponent _component;

    public void SomeMethod()
    {
        //try to use _component but it is null
    }
}
组装2

public interface IMyComponent
{
    //stuff...
}
组装3

[Export(typeof(IMyComponent)]
public MyComponent : IMyComponent
{
    //more stuff...
}
有人知道/知道为什么XLHandler中的_组件变量没有被MEF容器注入吗


是否需要为Assembly2中的接口导出/创建AssemblyCatalog?

导入零件时,您可以在属性上使用
[Import]
属性,或者将其作为构造函数的一部分请求,并使用
[ImportingConstructor]
属性

使用[Import]属性导入的任何零件在类的构造函数中都不可用

因此,在您的情况下,更改
XLHandler
类如下:

[Export]
public class XLHandler
{
    [ImportingConstructor]
    public void SomeMethod(MyComponent component)
    {
        _component = component;
       // You can use _component, since it has already been resolved...
    }
}

在MyBootstrapper.AutoOpen中,您需要替换:

cc.ComposeParts(this);
比如:

var handler = new XLHandler();
cc.ComposeParts(handler);
或:


顺便说一句,
MyComponent
没有编译。

那么[Import]有什么意义呢?很抱歉,我没能理解它。如何直接注入属性/类变量?
[Import]
可以在不需要在构造函数中立即解析该部分时使用。它将在一段时间后解析,从构造函数完成到调用该实例的任何属性/方法。好的,所以我将类变量更改为属性(添加了{get;set;}),但它仍然为null。理想情况下,我不想将变量作为方法参数传递,因为[Import]没有注入属性的原因仍然困惑不解。如果您试图在构造函数中引用它,它仍将为null。。。如果您希望它在构造函数中(或从构造函数内部调用的任何方法),则需要将其作为参数传递给构造函数,并使用
[ImportingConstructor]
Ah ok。我不是在构造函数中引用它-我还没有定义一个。我猜,因为ExcelDNA库正在实例化该类,它可能在MEF运行[Import]之前就已经这样做了?对此不是100%确定,但Import属性不应该是
[Import(typeof(IMycomponent))]
?是的,您是以
IMycomponent
的形式导出的,因此您也必须以此方式导入。您可以从导入中删除
typeof
定义,因为您的变量类型已经是IMyComponent。是的,这是Q中的一个输入错误。我会解决的。干杯。我实际上使用了两种答案的组合,但不确定如何同时接受这两种答案。通过Murtuza提升了这两个方面没有问题。谢谢
var handler = cc.GetExportedValue<XLHandler>();
public class MyBootstrapper
{
    [Import]
    XLHandler XLHandler;

    //Automatically called by ExcelDna library, I do not instantiate this class
    public void AutoOpen()
    {
        //Leave your implementation unchanged.
    }
}