1

这个问题是上一个关于使用 MediatR 和装饰器设置 DryIOC 的问题的又一个后续问题:DryIOC 和 MediatR:使用 InResolutionScopeOf 进行 IAsyncNotificationHandler 和 IAsyncRequestHandler 注入

在这个例子中,设置类似于我之前的问题,我们有请求 (IAsyncRequestHandler) 和通知 (IAsyncNotificationHandler),并且通知是从请求中触发的,并且两者都依赖于 DbContext,需要每个分辨率范围注入。

我现在正在做的是装饰 IAsyncRequestHandler 并且我正在使用一个键将 IActionHandler 类型的依赖项传递给装饰器。我正在注册这样的依赖项:

c.Register<IActionHandler, SomeActionHandler>(serviceKey: "key1");

然后,像这样将参数传递给装饰器:

c.Register(typeof(IAsyncRequestHandler<,>), typeof(Decorator<,>),
               made: Parameters.Of.Type<IActionHandler>(serviceKey: "key1"),
               setup: DryIoc.Setup.Decorator);

像这样设置,通知从请求处理程序成功触发。但是,如果我添加更多装饰器并将装饰器的设置参数更改为 DecoratorWith 并指定一个条件(即使它只是返回 true),则不会从请求处理程序中触发通知,因为 DbContext 未成功注入 IAsyncNotificationHandler .

这是一个显示问题的小提琴https://dotnetfiddle.net/ob0nfA

调试的时候发现第一个装饰器的DecoratorWith中的条件对于同一个服务类型被调用了两次,当有两个注册时。我不确定这是否是有意的,但是我相信这可能与问题有关,因为如果我只是返回 true,那么将为同一个处理程序注册多个装饰器,而应该只有一个。

我知道我可以使用 Made 来注册装饰器依赖项,但在这个特定的实例中,键控注册似乎更适合我的预期设置。所以我想知道我是否缺少某些东西,或者如果 DecoratorWith 为同一服务类型被多次调用而按预期工作,我想知道是否有一种方法可以区分调用,以便我只能正确注册一次装饰器。或者问题可能完全出在其他地方。

谢谢

4

1 回答 1

0

找到了原因。在当前的 DryIoc 版本 2.9.3 中,向装饰器添加条件使其依赖于上下文(顺便说一句,这是真的)。但是随后上下文相关的服务作为解析调用而不是表达式内联注入。在此处使用分辨率调用会混淆分辨率范围(尚未 100% 清楚如何)。

因此,如果我删除对上下文相关装饰器的解析调用的切换,您的代码将再次工作。

修复将很快发布。我将使用修复版本更新我的答案。

更新修复:

DryIoc 2.9.5中修复了问题

于 2016-12-10T13:00:02.990 回答