2

我正在尝试在 .NET Framework 4.5 中使用 MEF 约定,但我坚持认为应该很简单。

我想导出一组类,除了具有多个构造函数的类之外,所有类都在工作,因此 MEF 默认调用具有最多参数的构造函数,这会导致中断,因为参数没有导入,这就是它的方式我猜应该是。

无论如何,我想通过告诉 MEF 导出不带参数的构造函数来确保它正常工作。

var registration = new RegistrationBuilder();

registration.ForTypesDerivedFrom<TestStepResult>()
    .Export<TestStepResult>()
    .SelectConstructor(xxx);

所以我知道我需要在 SelectConstructor 中做一些事情,但找不到应该说什么来调用没有参数的构造函数。

4

3 回答 3

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 它返回第一个可用的。不过,这可能不是您所需要的。您将不得不决定如何处理这种情况。

于 2013-04-16T09:17:27.197 回答
1

你不能简单地用[ImportingConstructor]属性装饰首选构造函数吗?

于 2013-04-15T14:12:54.747 回答
0

AFAIK,您缺少的唯一步骤是:

registration.ForTypesDerivedFrom<TestStepResult>()
  .Export<TestStepResult>()
  .SelectConstructor(ctorInfos => ctorInfos[0]);

其中 ctorInfos 包含您为相关导出所拥有的 ctor 数组。

于 2013-04-15T14:18:59.887 回答