DryIOC,MediatR - DecoratorWith条件使用键控参数多次评估

时间:2016-12-09 17:43:47

标签: dryioc mediatr

此问题是关于使用MediatR和装饰器设置DryIOC的上一个问题的又一个后续问题:DryIOC and MediatR: Injection using InResolutionScopeOf for both IAsyncNotificationHandler and 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);

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

这是一个显示问题https://dotnetfiddle.net/ob0nfA

的小提琴

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

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

由于

1 个答案:

答案 0 :(得分:0)

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

因此,如果我删除了对上下文相关装饰器的分辨率调用的切换,那么您的代码将再次运行。

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

使用修复程序更新:

问题已在DryIoc 2.9.5

中修复