- 发送注册用户事件,修改Program.cs
app.MapPost("/register", async (RegisterUserEvent @event, IEventBus eventBus) =>{ await eventBus.PublishAsync(@event);});进阶处理流程EventBus的 请求管道包含一系列请求委托,依次调用 。它们与ASP.NET Core中间件有异曲同工之妙,区别点在于中间件的执行顺序与注册顺序相反,最先注册的最后执行

文章插图
每个委托均可在下一个委托前后执行操作,其中TransactionMiddleware是EventBus发布后第一个要进入的中间件 (默认提供),并且它是不支持多次嵌套的 。
EventBus 支持嵌套,这意味着我们可以在Handler中重新发布一个新的Event,但TransactionMiddleware仅会在最外层进入时被触发一次
自定义中间件根据需要我们可以自定义中间件,并注册到EventBus的请求管道中,比如通过增加FluentValidation, 将参数验证从业务代码中剥离开来,从而使得处理程序更专注于业务
- 注册FluentValidation, 修改Program.cs
builder.Services.AddValidatorsFromAssembly(Assembly.GetEntryAssembly());
- 自定义验证中间件ValidatorMiddleware.cs,用于验证参数
public class ValidatorMiddleware<TEvent> : Middleware<TEvent> where TEvent : IEvent{ private readonly ILogger<ValidatorMiddleware<TEvent>>? _logger; private readonly IEnumerable<IValidator<TEvent>> _validators; public ValidatorMiddleware(IEnumerable<IValidator<TEvent>> validators, ILogger<ValidatorMiddleware<TEvent>>? logger = null) { _validators = validators; _logger = logger; } public override async Task HandleAsync(TEvent @event, EventHandlerDelegate next) { var typeName = @event.GetType().FullName; _logger?.LogDebug("----- Validating command {CommandType}", typeName); var failures = _validators .Select(v => v.Validate(@event)) .SelectMany(result => result.Errors) .Where(error => error != null) .ToList(); if (failures.Any()) { _logger?.LogError("Validation errors - {CommandType} - Event: {@Command} - Errors: {@ValidationErrors}", typeName, @event, failures); throw new ValidationException("Validation exception", failures); } await next(); }}
经验总结扩展阅读
-
|这3种为女生“花钱”的方法,男人掌握后,能打动她的心
-
老北京|北京大爷住27平米小屋炫富惹争议,正宗老北京人到底“长”啥样?
-
-
-
杨玉环|杨玉环骗了我们一千多年!以胖为美的真相居然是
-
-
-
-
【幽默笑话】在富士康辞职以后|幽默笑话:老妈给我安排了一门亲事,硬是让我打扮了一番去相亲
-
iPhone5S能拍摄720p视频吗?iPhone5S支持720p播放吗?
-
导语:婚姻是条长满刺的毛毛虫 夫妻间的“高度差”如何调和?其实只在一念之差
-
-
模板骨相很绝的明星:张柏芝无视年龄,杨洋被封整容模板,肖战引争议
-
-
-
-
-
-
2023年农历七月初九结婚吉日 2023年农历七月初九宜结婚吗
-