【问题标题】:DryIOC, MediatR - DecoratorWith condition evaluated multiple times with keyed parameterDryIOC,MediatR - DecoratorWith 条件使用键控参数多次评估
【发布时间】:2016-12-09 17:43:47
【问题描述】:

这个问题是之前关于使用 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);

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

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

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

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

谢谢

【问题讨论】:

  • 乍一看似乎是一个错误..所以您的注册没有问题

标签: dryioc mediatr


【解决方案1】:

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

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

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

更新修复:

问题已在DryIoc 2.9.5 中修复

【讨论】:

  • 似乎在第四次注册时它再次停止工作。我知道这很奇怪,但这是我对代码的计数,我试图在小提琴中复制它,但它在第四次注册时再次停止工作。这是小提琴。 dotnetfiddle.net/Jnl6IN
  • 知道原因,会检查。感谢您提供实时示例。
  • 问题的发生是因为深度嵌套的对象图通过 Resolve 调用分成块。与以前相同的问题,但由于另一个原因。我正在尝试找出 Resolve 调用的一般问题。
猜你喜欢
  • 2012-05-09
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多