此问题是关于使用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按照预期通过多次调用相同的服务类型工作,我想知道我是否有办法区分调用,以便我只能正确注册装饰器一次。 或者问题可能完全在其他地方。
由于
答案 0 :(得分:0)
因此,如果我删除了对上下文相关装饰器的分辨率调用的切换,那么您的代码将再次运行。
修复将很快发布。我将使用修复版本更新我的答案。
问题已在DryIoc 2.9.5
中修复