MEF抛出异常ImportCardinalityMismatchException?

Con*_*ngo 6 c# mef

MEF抛出ImportCardinalityMismatchException的可能原因是什么?

Con*_*ngo 5

下面的代码演示了如何重现此错误。

要进行测试,请确保使用 .NET 4.5 进行编译,并添加 MEF 程序集:

  • 系统.组件模型.组合
  • System.ComponentModel.Composition.Registration

问题是 MEF 想要构造一个 Person 对象,但它无法完成“Age”(标记为“Import”)的属性注入。

要重现该错误,请注释掉下面标记的行。

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;

namespace ForStackOverflow
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var container = new CompositionContainer(
                new AssemblyCatalog(Assembly.GetExecutingAssembly()));

            // Comment out this next line to get an
            // ImportCardinalityMismatchException error
            container.ComposeExportedValue("Age", 30); 

            var person = container.GetExportedValue<Person>();

            Console.WriteLine("Persons age: " + person.Age);
            Console.WriteLine("[press any key to continue]");
            Console.ReadKey();
        }
    }

    [Export]
    public class Person
    {
        [ImportingConstructor]
        public Person()
        {
        }

        [Import("Age")]
        public int Age { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这很棒,但是...我如何找到哪个导入破坏了它? (4认同)
  • 这是一个价值百万美元的问题。MEF 并不是真正设计为完整的依赖注入解决方案,并且缺少其他 DI 容器所具有的许多功能。特别是,很难找到 MEF 错误的原因,因为它们的错误消息信息不多。您确实需要定期进行源代码控制,以便在出现错误时可以回滚。需要注意的要点是,此错误是由 DI 容器尝试解析容器中缺少的依赖项引起的。 (3认同)
  • 考虑到 MEF 的局限性,我建议使用其他工具,例如 Unity,除非您想设计具有可插拔模块的应用程序。这就是 MEF 的设计目的。 (3认同)
  • @Contango:mef 有一个名为 MEFX 的调试工具:http://mef.codeplex.com/releases/view/33536,可以将其集成到您的应用程序中。它显示哪些类满足哪些依赖关系和类似信息。 (3认同)
  • MEFX 现已在 [.NET 4.0 Beta 的 MEF 分析工具 (mefx)](https://github.com/MicrosoftArchive/mef/releases/tag/4.0) 上使用,甚至还有 [文档](https://learn.microsoft .com/en-us/dotnet/framework/mef/composition-analysis-tool-mefx)。 (2认同)