0

我得到了异常:1)找到了多个与约束匹配的导出:ContractName CompositionTest.C RequiredTypeIdentity CompositionTest.C

运行程序时

命名空间组合测试 {

// [Export]  // Also doesn't work
[Export(typeof(C))]
public class C  
{
    //[ImportAttribute(AllowRecomposition = true)]  // also doesn't work
    [Import(AllowRecomposition = true)]
    public C PropertyC { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // Declare a composition container.
        CompositionContainer compositionContainer = new CompositionContainer();

        compositionContainer.ComposeParts( new C() );  

        compositionContainer.ComposeParts( new C() );  // exception here!
    }
}

}

我究竟做错了什么?

4

1 回答 1

2

第一次调用 时ComposeParts,会将一个新C对象作为导出添加到容器中。然后第二次调用ComposeParts,将另一个C对象添加为导出。这会给导入带来问题,因为有两个可能的导入部分,MEF 无法做出决定。因此,基数例外。

一种解决方案是将导入更改为:

[ImportMany(AllowRecomposition = true)]
public IEnumerable<C> PropertyC { get; set; }

另一种解决方案是在创建容器时实际使用目录。这是使用 MEF 的常用方法。您可以找到的几乎所有示例都遵循这种方法:

//Create a catalog. In this case, a catalog based on an already loaded assembly.
var catalog = new AssemblyCatalog(typeof(C).Assembly);
//Create a container using the catalog. Only the parts from that catalog will be used.
var compositionContainer = new CompositionContainer(catalog);

有关目录的更多信息,您应该阅读这篇文章

顺便说一句,我以前从未见过这样的 MEF 使用示例。我的回答主要基于我在调试它时所做的观察。

于 2013-03-01T13:26:46.370 回答