3

我有一个不起作用的导入 - 对象为空。最初它是 ImportMany,但我将其简化为 Import 以尝试识别问题,但我没有成功。

我浏览了这个网站和谷歌并遵循了主要思想:

  • 不要自己实例化类,让 MEF 来做,否则调用 container.getExport() - 仍然不起作用
  • 将 [Export] 放在包含 [Import] 属性的类上,否则它不会被容器组合过程作为一部分拾取(在调试时确认)。

我的代码设置如下(为了紧凑而简化):

组装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 中的 _component 变量没有被 MEF 容器注入?

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

4

2 回答 2

8

导入部件时,您可以使用[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...
    }
}
于 2013-03-02T22:55:10.933 回答
2

MyBootstrapper.AutoOpen你需要更换:

cc.ComposeParts(this);

有类似的东西:

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

或者:

var handler = cc.GetExportedValue<XLHandler>();

你不能组成的部分,MyBootstrapper因为它没有进口。ComposeParts什么也没做。

另一种方法是将导入添加到MyBootstrapper. 像:

public class MyBootstrapper
{
    [Import]
    XLHandler XLHandler;

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

顺便说一句MyComponent不编译。

于 2013-03-04T09:40:35.643 回答