gpt4 book ai didi

c# - MediatR 不处理逆变通知

转载 作者:行者123 更新时间:2023-12-03 08:10:54 27 4
gpt4 key购买 nike

在 MediatR 的文档中说:

Containers that support generic variance will dispatch accordingly. For example, you can have an INotificationHandler<INotification> to handle all notifications.

但就我而言,它不起作用。我的问题是如何使其工作逆变,这样我就不必为每种通知类型创建特定的处理程序?

我有这样的模型层次结构:

abstract record AuditRequestBase : INotification {}
abstract record SpecificAuditRequestBase : AuditRequestBase {}
record CreateSpecificPurchaseOrderAuditRequest : SpecificAuditRequestBase {}

其中前两条记录位于单独的库中,连接到工作项目,最后一条记录位于工作项目中

和处理程序

class LogStorageHandler : INotificationHandler<SpecificAuditRequestBase>

但是当我尝试像这样向中介者发布通知时

_mediator.Publish(new CreateSpecificPurchaseOrderAuditRequest())

什么也没发生。我查看了 MediatR 的源代码,它无法解决依赖关系 INotificationHandler<SpecificAuditRequestBase> .

但是如果我创建两个处理程序而不是一个处理程序

class LogStorageHandler : INotificationHandler<SpecificAuditRequestBase>
class LogStorageHandler2 : INotificationHandler<CreateSpecificPurchaseOrderAuditRequest>

然后第一个处理程序(即 LogStorageHandler )开始处理该通知(与 LogStorageHandler2 相同)。

启动文件最初看起来像这样

services.AddMediatR(typeof(TStartup));

但后来我也尝试添加另一个库,以防万一 - 它没有帮助

services.AddMediatR(typeof(TStartup), typeof(WatchGuardAuditRequestBase));

版本:MediatR - 9.0.0
点网5

依赖注入(inject)是嵌入式的。

最佳答案

这是您的容器的问题,而不是 MediatR 或 DI 扩展库的问题。如果您希望差异发挥作用,您需要注册一个开放式泛型。例如:

class LogStorageHandler<T> : INotificationHandler<T> 
where T : SpecificAuditRequestBase

现在当容器寻找IEnumerable<INotificationHandler<T>>时它会尝试填写 T多于。您还需要在容器中注册开放通用,MediatR 的 DI 扩展不会为您执行此操作:

services.TryAddTransient(typeof(LogStorageHandler<>));

您可以查看 MS DI 项目的单元测试,以了解它在这些更复杂的场景中支持的内容。否则,我会在单独的单元测试中将容器与 MediatR 隔离。 MediatR 只是遵循容器通过 IServiceProvider 注册依赖项。 .

关于c# - MediatR 不处理逆变通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70852634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com