我正在尝试在.NET Framework 4.5中使用MEF约定,并坚持我认为应该简单的事情。
我想导出一组类,除了具有多个构造函数的类外,所有类都在工作,因此默认情况下MEF调用具有最多参数的构造函数,这会导致中断,因为参数不是导入的我猜是怎么回事。
无论如何,我想通过告诉MEF导出没有参数的构造函数来确保它的工作原理。
var registration = new RegistrationBuilder();
registration.ForTypesDerivedFrom<TestStepResult>()
.Export<TestStepResult>()
.SelectConstructor(xxx);
所以我知道我需要在SelectConstructor中做一些事情,但是找不到用来调用没有参数的构造函数的内容。
答案 0 :(得分:1)
你能不能简单地使用[ImportingConstructor]
属性装饰首选构造函数?
答案 1 :(得分:1)
一种方法是:
registration.ForTypesDerivedFrom<TestStepResult>()
.Export<TestStepResult>()
.SelectConstructor(ctorInfos =>
{
var parameterLessCtor = ctorInfos.FirstOrDefault(ci => ci.GetParameters().Length == 0);
if (parameterLessCtor != null)
return parameterLessCtor;
else
return ctorInfos.First();
});
请注意,它包含一些简单的错误处理。如果没有无参数的.ctor,则返回第一个可用的.ctor。这可能不是你需要的。你必须决定如何处理这种情况。
答案 2 :(得分:0)
AFAIK,您唯一缺少的一步是:
registration.ForTypesDerivedFrom<TestStepResult>()
.Export<TestStepResult>()
.SelectConstructor(ctorInfos => ctorInfos[0]);
其中ctorInfos包含您有关导出的ctors数组。