【问题标题】:MEF 2 - No exports were found that matched the constraint for constructor with multiple overloadsMEF 2 - 没有找到与具有多个重载的构造函数的约束相匹配的导出
【发布时间】:2013-11-15 07:01:21
【问题描述】:

错误:

The composition produced a single composition error, with 2 root causes. The root causes are provided below. Review the CompositionException.Errors property for more detailed information.

1) No exports were found that match the constraint: 
    ContractName    MyNonMefInterface
    RequiredTypeIdentity    MyNonMefInterface

Resulting in: Cannot set import 'MyMefClass..ctor (Parameter="myNonMefClass", ContractName="MyNonMefInterface")' on part 'MyMefClass'.

有没有办法告诉MEF不要尝试导入“myInterface”?它是一个可选参数,如果没有传递给构造函数,它已经被默认了:

public MyMefClass() : (new MyNonMefClass()) {}
public MyMefClass(myNonMefInterface myNonMefClass) {
    _myNonMefClass = myNonMefClass;
}

我正在使用 MEF 2 的新属性少配置并像这样执行我的 RegistrationBuilder:

var builder = new RegistrationBuilder();
builder.ForTypesDerivedFrom<IMyMefClass>().ExportInterfaces();
...
var aggregateCatalog = new AggregateCatalog();

aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyMefClass).Assembly, builder));

var container = new CompositionContainer(aggregateCatalog, CompositionOptions.DisableSilentrejection);

基本上,我总是在默认构造函数中设置 MyNonMefClass 的默认值,但允许自己重载它以进行测试。它不是为 MEF 设置的并且来自另一个 dll,所以如果我可以告诉 MEF 忽略它并使用不带参数的构造函数,那将是最简单的解决方案。有人知道怎么做吗?

编辑:我可以通过在空构造函数上设置 [ImportingConstructor] 标记来解决它,但这意味着我也必须在该项目中引用 MEF,我是否能够通过新的 fluent API 使用以某种方式代替 RegistrationBuilder?

【问题讨论】:

    标签: c# .net mef


    【解决方案1】:

    要在 MEF 中获取可选导入,您应该使用 Optional Imports。例如在您的代码中:

    public MyMefClass([Import(AllowDefault=true)]myNonMefInterface myNonMefClass) {
        _myNonMefClass = myNonMefClass;
    }
    

    【讨论】:

    • 我已经能够通过使用[ImportingConstructor] 属性来修复它,但我希望能够通过RegistrationBuilder 的新流利API 来修复它,所以我不必这样做让我导出的课程对 MEF 有任何了解(他们目前没有 [Export] 属性,因为该属性由 RegistrationBuilder 处理
    【解决方案2】:

    好的我找到答案了,有一个SelectConstructor方法:

    builder.ForTypesDerivedFrom<IMyMefClass>().SelectConstructor(ctors =>
    {
        var minParams = ctors.Min(ctor => ctor.GetParameters().Length);
        return ctors.First(ctor => ctor.GetParameters().Length == minParams);
    }).ExportInterfaces();
    

    这将选择最少数量的参数,默认情况下选择最多。希望对其他人有所帮助! :)

    http://blogs.msdn.com/b/bclteam/archive/2011/11/01/getting-started-with-convention-based-part-registration-in-mef-version-2.aspx

    【讨论】:

    • 你从哪里得到 .SelectConstructor 以及 ctors.Min 和 ctor.GetParameter?我没有...
    • @GutembergRibeiro 您使用的是 MEF 2 还是 MEF 1? blogs.msdn.com/b/bclteam/archive/2011/11/01/… 有更多详细信息,我也会将其添加到我的帖子中
    • 奇怪的想法是我根本没有构造函数,所以这意味着将调用默认的无参数 ctor,但我知道为什么它仍然给出以下错误:组合产生了单个组合错误。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。 1) 找不到方法:'Void PI.Switch.Hosting.AppBase..ctor(System.String)'。
    • 另外,我使用的是最新版本的 .Net/MEF
    • @GutembergRibeiro 我建议为它提出一个新问题,以便您可以添加一些代码/详细信息,请随时将其链接给我,以便我可以帮助您解决问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多