这个问题是上一个关于使用 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 为同一服务类型被多次调用而按预期工作,我想知道是否有一种方法可以区分调用,以便我只能正确注册一次装饰器。或者问题可能完全出在其他地方。
谢谢