我正在使用通用类型请求和处理程序。
如果我有多个IAsyncRequestHandler,DryIoc正在解析多个实例,而不是单个实例,导致MediatR抛出异常。
我怎么能解决这个问题?
请在Net Fiddle here检查这种行为。(注意,在这个例子中,Generic Type仅用于证明这一点 - MediatR抛出异常 - 在我的生产代码中,实际上需要通用类型)
答案 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<>))
设计为更宽容,因此它将跳过这一对。