我知道从 MEF 2 开始,MEF 支持将开放的泛型类型组合成封闭的类型。我正在尝试从添加到同一个组合容器的两个不同程序集导出的类型中组合一个封闭类型,并且我收到 ImportCardinalityMismatchException。我正在对其中一个程序集使用约定,因为它不在我的控制之下。对于其他我使用了属性。
我不确定如何表达我的问题,因为我发现围绕泛型的术语相当混乱,但我希望在不显式实现我自己的类、从 Foo 继承并为其提供我的 FooUser 类型参数的情况下编写我的新封闭类型。我不知道这是否与我的操作方式有关,或者是否与类型位于不同程序集中的事实有关。
在一个程序集中,我有以下内容:
public class Foo<T> where T : Bar {}
public class Bar {}
在另一个程序集中,我有以下内容:
[Export]
public class Bar2 : Bar {}
[Export]
public class Something
{
[ImportingConstructor]
public Something([Import(typeof(Foo<>))] Foo<Bar2> foo) {}
}
在我的注册码中,我做了以下事情:
var conventions = new RegistrationBuilder();
conventions.ForType(typeof(Foo<>)).Export();
var aggregateCatalog = new AggregateCatalog();
var catalog = new AssemblyCatalog(typeof(Foo<>).Assembly, conventions);
aggregateCatalog.Catalogs.Add(catalog);
catalog = new AssemblyCatalog(typeof(Something).Assembly);
aggregateCatalog.Catalogs.Add(catalog);
catalog = new AssemblyCatalog(typeof(Bar2).Assembly);
aggregateCatalog.Catalogs.Add(catalog);
var container = new CompositionContainer(aggregateCatalog, CompositionOptions.DisableSilentRejection);
var batch = new CompositionBatch();
batch.AddExportedValue(container);
container.Compose(batch);
后来我尝试这样导出我的值:
container.GetExportedValue<Something>();
异常:抛出:“未找到与约束匹配的导出:ContractName Foo(Bar2)RequiredTypeIdentity Foo(Bar2)”(System.ComponentModel.Composition.ImportCardinalityMismatchException)抛出了 System.ComponentModel.Composition.ImportCardinalityMismatchException:“未找到导出与约束匹配:ContractName Foo(Bar2) RequiredTypeIdentity Foo(Bar2)"
我查看了我的约定实例,并在容器中查看了我的部分,即 Foo{0}、Bar2 和Something。但是,我仍然收到 System.ComponentModel.Composition.ImportCardinalityMismatchException。
我已经在更抽象的情况下看到了这一点,比如有 IRepository,但没有更具体的东西,也没有跨越程序集的项目。任何帮助将不胜感激。除非有任何帮助,否则我可能会从有问题的类型继承并完成它。
编辑:我刚刚构建了上面详述的非常简化的示例,因为我在现实世界的项目中实际上正在做一些与我在这里不同的事情并且我有不同的相似结果。我重命名了一些类型以使它们与我的简化示例保持一致。
合成产生了一个单一的合成错误。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。
1) 未找到与约束匹配的导出:ContractName CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2) RequiredTypeIdentity CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)
导致:无法在“CompositionTest.Something”部分设置导入“CompositionTest.Something..ctor (Parameter="foo", ContractName="CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)")”。元素:CompositionTest.Something..ctor (Parameter="foo", ContractName="CompositionTestLibrary.Foo(CompositionTestLibrary2.Bar2)") --> CompositionTest.Something --> AssemblyCatalog (Assembly="CompositionTest, Version=1.0.0.0,文化=中性,PublicKeyToken=null")
导致:无法从“CompositionTest.Something”部分导出“CompositionTest.Something (ContractName="CompositionTest.Something")”。元素:CompositionTest.Something (ContractName="CompositionTest.Something") --> CompositionTest.Something --> AssemblyCatalog (Assembly="CompositionTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")