我不完全确定如何说出我的问题,因为我发现围绕泛型的术语相当令人困惑但我想要在没有显式实现我自己的类的情况下编写我的新闭合类型,继承自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,Culture = neutral,PublicKeyToken = null”)
导致:无法从“CompositionTest.Something”部分导出’CompositionTest.Something(ContractName =“CompositionTest.Something”)’.
元素:CompositionTest.Something(ContractName =“CompositionTest.Something”) – > CompositionTest.Something – > AssemblyCatalog(Assembly =“CompositionTest,PublicKeyToken = null”)
解决方法
catalog = new AssemblyCatalog(typeof(FooUser).Assembly,conventions);
至
catalog = new AssemblyCatalog(typeof(FooUser).Assembly);
在这里使用约定实际上不会从定义FooUser和Something的程序集中导出任何东西,因此您将无法获得Something的组合值.删除它将允许导出和组合某些东西.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。