当预期单个时,MediatR会获得多个处理程序实例

时间:2017-02-13 19:40:26

标签: dryioc mediatr

我正在使用通用类型请求和处理程序。
如果我有多个IAsyncRequestHandler,DryIoc正在解析多个实例,而不是单个实例,导致MediatR抛出异常。
我怎么能解决这个问题?

请在Net Fiddle here检查这种行为。(注意,在这个例子中,Generic Type仅用于证明这一点 - MediatR抛出异常 - 在我的生产代码中,实际上需要通用类型)

1 个答案:

答案 0 :(得分:2)

问题的解决方法是DryIoc 2.10.1

原因详情有问题#446

更新

关于class HostViewController: MenuContainerViewController { override func viewDidLoad() { super.viewDidLoad() self.menuViewController = YourMenuViewController() self.contentViewControllers = [YourContentViewController()] self.selectContentViewController(contentViewControllers.first!) } } 的示例,该异常有点误导,但它正如预期的那样。

原因是DryIoc class GoodMorningRequestHandler<T> : IAsyncRequestHandler<GoodMorningRequest, string>根本没有注册上面的映射。这是因为RegisterMany检查服务类型(RegisterMany)应该为实现IAsyncRequestHandler<GoodMorningRequest, string>提供开放式通用参数T,显然它不能这样做。因此,此服务类型被过滤掉。

之后,剩下的实现将GoodMorningRequestHandler<T>与解析的HelloRequestHandler<T>不匹配,因此异常。

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

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