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],否则容器组合过程(调试时确认)不会将其作为一个部分拾取
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.
}
}