在MediatR中能否用单个处理程序处理多个继承基类的通知?
问题解答
默认情况下,你写的CommandHandler无法直接处理Notification1和Notification2的通知请求,原因是INotification/INotificationHandler所属的MediatR框架,默认匹配逻辑是:发布某个具体类型的通知时,只会寻找实现对应具体类型INotificationHandler<T>的处理程序,不会自动关联到基类的处理程序。
不过有两种简单方式能实现你要的“单个处理程序处理所有子类通知”的需求:
方案一:使用开放泛型处理程序
把处理程序改成泛型版本,约束泛型参数为Notification的子类:
public class CommandHandler<T> : INotificationHandler<T> where T : Notification { public Task Handle(T notification, CancellationToken cancellationToken) { // 序列化和日志逻辑,这里的notification可以是任何Notification子类 return Task.CompletedTask; } }
然后在依赖注入容器中注册这个开放泛型:
services.AddTransient(typeof(INotificationHandler<>), typeof(CommandHandler<>));
这样不管是发布Notification1还是Notification2,MediatR都会自动匹配到这个泛型处理程序。
方案二:手动注册基类处理程序为子类的处理程序
如果不想改泛型,也可以手动在DI容器中把CommandHandler注册为每个子类的处理程序:
// 注册处理Notification本身 services.AddTransient<INotificationHandler<Notification>, CommandHandler>(); // 注册处理Notification1 services.AddTransient<INotificationHandler<Notification1>, CommandHandler>(); // 注册处理Notification2 services.AddTransient<INotificationHandler<Notification2>, CommandHandler>();
这种方式下,每个子类的通知都会触发CommandHandler的逻辑。
额外提示
- 如果你的处理逻辑只用到基类
Notification的Message属性,两种方案都适用; - 如果需要访问子类的特有属性(比如
Notification1的Count、Notification2的Details),泛型方案更友好,不需要做强制类型转换。
内容的提问来源于stack exchange,提问作者GXtal
相关产品推荐
相关产品推荐

