Dryioc MediatR在需要单个处理程序时获取多个处理程序实例

Dryioc MediatR在需要单个处理程序时获取多个处理程序实例,dryioc,mediatr,Dryioc,Mediatr,我正在使用泛型类型请求和处理程序。如果我有多个IAsyncRequestHandler,DryIoc正在解析多个实例,而不是单个实例,导致MediatR引发异常。如何解决此问题?请在Net Fiddle上检查此行为。(请注意,在本例中,泛型类型仅用于证明这一点——MediatR引发异常——在我的生产代码中,泛型类型实际上是必需的)您的问题的解决方案已经完成 具体原因仍有争议 更新: 关于带有类GoodMorningRequestHandler:IAsyncRequestHandler的示例,异常

我正在使用泛型类型请求和处理程序。
如果我有多个IAsyncRequestHandler,DryIoc正在解析多个实例,而不是单个实例,导致MediatR引发异常。
如何解决此问题?

请在Net Fiddle上检查此行为。
(请注意,在本例中,泛型类型仅用于证明这一点——MediatR引发异常——在我的生产代码中,泛型类型实际上是必需的)

您的问题的解决方案已经完成

具体原因仍有争议

更新: 关于带有
类GoodMorningRequestHandler:IAsyncRequestHandler的示例,异常有点误导,但正如预期的那样

原因是DryIoc
RegisterMany
根本没有注册上述映射。发生这种情况是因为
RegisterMany
检查服务类型(
IAsyncRequestHandler
)应该为实现
GoodMorningRequestHandler
提供开放的泛型参数
T
,显然它不能这样做。因此,此服务类型被过滤掉

在此之后,剩下的实现将是
HelloRequestHandler
,它与已解析的
IAsyncRequestHandler
不匹配,因此出现异常

要自行确认,请尝试明确注册:


container.Register(typeof(IAsyncRequestHandler),typeof(GoodMorningRequestHandler))
。它将抛出异常。相比之下,
RegisterMany
设计得更宽容,因此它将跳过这一对。

对您的测试进行了一些处理-顺便说一句,感谢提供。我有一种感觉,可能是DryIoc方面的问题,RegisterMany没有注册非封闭嵌套泛型类型。但这很奇怪,为什么以前找不到它。安装非常简单。我会调试并提供更多信息。谢谢,dadhi。我想泛型类型请求和处理程序不是很常见:)也许这就是它以前没有出现的原因。这个问题是可以重现的,但现在还不知道为什么。您是否尝试检查MediatR v3?使用MediatR 3.0.0会引发不同的异常。它试图解析IRequestHandler而不是IAsyncRequestHandler(奇怪的东西)。过来看。我已经发布了一个关于这个问题的问题。我的VS 2015上的例外是“无法解析MediatR.IRequestHandler.Where未找到服务注册和规则数。后备容器:0和规则数。UnknownServiceResolver:0”。完整图片现在已清楚。看来你发现了新的DryIoc bug,它带有开放泛型。现在修复。当所有MediatR请求都是泛型类型时,修复程序可以解析所有IAsyncRequestHandler。就我的测试而言,当您使用泛型类型的IAsyncRequestHandler进行常规请求时,问题就会出现。请检查一个恼人的样品,好像我最后把它弄糟了。将重新检查并推送新版本。我推断是这样的,因为RequestHandler没有注册。无论如何,我已经在我的请求中包含了泛型类型,尽管我实际上并不需要它,而且一切都很好。谢谢,继续努力。