问题标签 [open-generics]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
624 浏览

c# - 温莎城堡注册关闭 - 开放通用

如何注册 IProcessHandler> ?

0 投票
2 回答
1014 浏览

c# - 在 MEF 2 中组合开放泛型类型和封闭类型

我知道从 MEF 2 开始,MEF 支持将开放的泛型类型组合成封闭的类型。我正在尝试从添加到同一个组合容器的两个不同程序集导出的类型中组合一个封闭类型,并且我收到 ImportCardinalityMismatchException。我正在对其中一个程序集使用约定,因为它不在我的控制之下。对于其他我使用了属性。

我不确定如何表达我的问题,因为我发现围绕泛型的术语相当混乱,但我希望在不显式实现我自己的类、从 Foo 继承并为其提供我的 FooUser 类型参数的情况下编写我的新封闭类型。我不知道这是否与我的操作方式有关,或者是否与类型位于不同程序集中的事实有关。

在一个程序集中,我有以下内容:

在另一个程序集中,我有以下内容:

在我的注册码中,我做了以下事情:

后来我尝试这样导出我的值:

异常:抛出:“未找到与约束匹配的导出: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")

0 投票
5 回答
1168 浏览

c# - 是否可以在一个地方保留一个开放泛型类型的列表?

我正在尝试拥有一个List开放的泛型类型。是否有可能有类似的东西:

IMessageHandler应该有一个强类型的方法:

我的真实例子稍微复杂一点,所以我希望我在这里正确地简化了它。

事实是,我对每个处理程序的泛型类型不感兴趣。我只需要将它们全部放在一个地方,如果我可以将它们放在那个地方,我可以轻松找到正确的处理程序。

私有字典将以消息的类型 (TMessage) 作为键。所以我希望能够做到:

并有MessageProcessor正确的调用MessageHandler

0 投票
1 回答
485 浏览

c# - 如何使用具有嵌套开放泛型的复合处理程序?

登记:

事件调用

返回空但必须返回两个处理程序:

虽然如下所示会很好:

如果我调用“_container.GetInstance(handlerType)”而不是“GetAllInstances”,则会发生错误:

注册开放泛型类型 IMessageHandler 时出错。无法为类型 ValidateMessageEnvelopeHandler> 构建注册。注册开放泛型类型 IMessageHandler 时出错。无法为 SecureMessageEnvelopeHandler 类型构建注册。SecureMessageEnvelopeHandler 类型的构造函数包含名称为“innerHandler”的 IMessageHandler 类型的参数,该参数未注册。请确保在容器中注册了 IMessageHandler,或者更改 SecureMessageEnvelopeHandler 的构造函数。

当我注册 CompositeHandler () 我有错误。( Container.RegisterOpenGeneric(typeof(IMessageHandler<>), typeof(CompositeMessageHandler<>));)

注册开放泛型类型 IMessageHandler 时出错。无法为类型 ValidateMessageEnvelopeHandler> 构建注册。ResolveUnregisteredType 事件的多个观察者正在为同一服务类型注册一个委托:IMessageHandler>。确保只有一个已注册的处理程序调用给定服务类型的 ResolveUnregisteredType.Register 方法。

我怎样才能解决这个问题?

0 投票
2 回答
1016 浏览

c# - SimpleInjector 如何为单个通用实现注册多个开放通用接口

我正在尝试将 SimpleInjector 作为 IOC 容器开始使用,到目前为止我对它非常满意。但是现在我被困在一个我无法解决的问题上。我在 SO 和文档中进行了搜索,但似乎还没有答案。我已经看过SimpleInjector 的 howto 文档,但这不包括开放的通用接口。

我有两个像这样的通用接口:

以及这两者的一个开放通用实现:

在我的应用程序中,我正在像这样设置 SimpleInjector:

我要存档的是:我希望在请求 IEventPublisher 或 IEventSubscriber 时获得完全相同的实例。此外,这个 Instance 应该是任何 T 的单例。

我已经用这些线测试了这个:

不幸的是 p 和 s 不是指同一个实例。有人碰巧知道这个问题的解决方案吗?

0 投票
2 回答
497 浏览

.net - 类型受限的开放泛型不适用于 RegistrationBuilder

下面的代码在使用时不起作用RegistrationBuilder。当RegistrationBuilder未添加到 AssemblyCatalog 构造函数时,类型约束泛型起作用。

0 投票
2 回答
309 浏览

c# - 使用 Ninject 开放泛型和 IEnumerable

我有以下界面...

这通常是这样实现的......

IRequest只是一个标记界面(此时)。

我通过以下约定注册所有处理程序...

他们单独解决就好了。

在一种情况下,我想解析所有处理程序,并将它们注入到这样的构造函数中......

这不起作用并且总是返回空。

我的理解是因为我按照惯例将它们注册为IHandler<ConcreteRequest>,而不是IHandler<IRequest>2 个不同的签名。

我如何按照惯例注册所有处理程序,以便将它们共同识别为IEnumerable<IHandler<IRequest>>同时也单独识别?

第二次注册是可以的,但更喜欢通过两个签名解决一个实现。

0 投票
0 回答
164 浏览

dependency-injection - 使用开放的泛型类型注册结构映射会导致错误

打开通用类型

执行

登记

用法

问题:

接口ICrudRepository在项目 MyApp.Repository 内,实现在项目 MyApp.Data 内。在调用 HomeController 时,我遇到了如下异常。不知道出了什么问题?

<没有为 ICrudRepository Employee, Int32类型注册默认实例并且无法自动确定没有为 ICrudRepository Employee, Int32>指定配置<>

这是我有什么的转储?

0 投票
2 回答
387 浏览

c# - 如何在 SimpleInjector 2.6.1+ 中对开放的通用装饰器链进行单元测试

给定以下使用 SimpleInjector 的开放通用 deocrator 链:

使用 SimpleInjector 2.4.0,我能够使用以下代码对其进行单元测试以断言装饰链:

更新到 SimpleInjector 2.6.1 后,此单元测试失败。现在似乎InstanceProducer.Registration.ImplementationType返回第一个装饰处理程序而不是装饰处理程序(意思是,它返回typeof(QueryNotNullDecorator<HandleFakeQueryWithoutValidator,string>)而不是typeof(HandleFakeQueryWithoutValidator).

此外,InstanceProducer.GetRelationships()不再返回链中的所有装饰器。它也只返回第一个装饰器。

这是一个错误吗?如果不是,我们如何使用 SimpleInjector 2.6.1+ 对开放的通用装饰器链进行单元测试?

0 投票
1 回答
635 浏览

c# - 使用 autofac 的开放泛型的条件注册装饰器

我有这些开放的泛型:

和这个单一的装饰器:

我想要的是仅为正在实现的查询注册装饰器ICacheableQuery<out TResult>。我正在注册这样的组件:

但它为所有类型注册了装饰器。任何想法?提前致谢。