MediatR 在预期为单个时获取多个处理程序实例
MediatR gets multiple handlers instances when expected single
我正在使用通用类型请求和处理程序。
如果我有多个 IAsyncRequestHandler,DryIoc 正在解析多个实例,而不是单个实例,从而导致 MediatR 抛出异常。
我该如何解决这个问题?
请在 Net Fiddle here.
上检查此行为(请注意,在此示例中,通用类型仅用于证明这一点 - MediatR 抛出异常 - 在我的生产代码中,实际上需要泛型类型)
DryIoc 2.10.1 已解决您的问题。
原因详情有问题#446。
更新:
关于带有 class GoodMorningRequestHandler<T> : IAsyncRequestHandler<GoodMorningRequest, string>
的样本,异常有点误导,但它如预期的那样存在。
原因是上面的映射根本没有被DryIoc注册RegisterMany
。发生这种情况是因为 RegisterMany
检查服务类型 (IAsyncRequestHandler<GoodMorningRequest, string>
) 应该为实现 GoodMorningRequestHandler<T>
提供 open-generic 参数 T
,显然它不能那样做。因此这种服务类型被过滤掉了。
之后,剩余的实现将是 HelloRequestHandler<T>
,与已解决的 IAsyncRequestHandler<GoodMorningRequest, string>
不匹配,因此例外。
要自己确认,请尝试直接注册:
container.Register(typeof(IAsyncRequestHandler<GoodMorningRequest, string>), typeof(GoodMorningRequestHandler<>))
。它会抛出异常。相比之下 RegisterMany
设计得更宽容,因此它会跳过这对。
我正在使用通用类型请求和处理程序。
如果我有多个 IAsyncRequestHandler,DryIoc 正在解析多个实例,而不是单个实例,从而导致 MediatR 抛出异常。
我该如何解决这个问题?
请在 Net Fiddle here.
上检查此行为(请注意,在此示例中,通用类型仅用于证明这一点 - MediatR 抛出异常 - 在我的生产代码中,实际上需要泛型类型)
DryIoc 2.10.1 已解决您的问题。
原因详情有问题#446。
更新:
关于带有 class GoodMorningRequestHandler<T> : IAsyncRequestHandler<GoodMorningRequest, string>
的样本,异常有点误导,但它如预期的那样存在。
原因是上面的映射根本没有被DryIoc注册RegisterMany
。发生这种情况是因为 RegisterMany
检查服务类型 (IAsyncRequestHandler<GoodMorningRequest, string>
) 应该为实现 GoodMorningRequestHandler<T>
提供 open-generic 参数 T
,显然它不能那样做。因此这种服务类型被过滤掉了。
之后,剩余的实现将是 HelloRequestHandler<T>
,与已解决的 IAsyncRequestHandler<GoodMorningRequest, string>
不匹配,因此例外。
要自己确认,请尝试直接注册:
container.Register(typeof(IAsyncRequestHandler<GoodMorningRequest, string>), typeof(GoodMorningRequestHandler<>))
。它会抛出异常。相比之下 RegisterMany
设计得更宽容,因此它会跳过这对。