ASP.NET Core用MediatR实现领域事件

目录

领域事件的实现选择

实现方式1:C#的事件机制

实现方式2:进程内消息传递的开源库MediatR。

MediatR用法

注意


领域事件的实现选择

实现方式1:C#的事件机制

缺点:需要显式地注册。

cs 复制代码
var bl = new ProcessBusinessLogic();
bl.ProcessCompleted += bl_ProcessCompleted;
bl.StartProcess();

实现方式2:进程内消息传递的开源库MediatR。

事件的发布和事件的处理之间解耦。MediatR中支持"一个发布者对应一个处理者"和"一个发布者对应多个处理者"这两种模式。

MediatR用法
  1. NuGet:MediatR

  2. Program.cs中调用AddMediatR()

    cs 复制代码
    builder.Services.AddMediatR(cfg =>
    {
        cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly());
    });
  3. 定义一个在消息的发布者和处理者之间进行数据传递的类,这个类需要实现INotification接口。一般用record类型。

    cs 复制代码
    public record PostNotification(string Body) : INotification;
  4. 消息的处理者要实现NotificationHandler<TNotification>接口,其中的泛型参数TNotification代表此消息处理者要处理的消息类型。

    cs 复制代码
    public class PostNotifHandler1 : NotificationHandler<PostNotification>
    {
        protected override void Handle(PostNotification notification)
        {
            Console.WriteLine("111"+notification.Body);
        }
    }
  5. 在需要发布消息的的类中注入IMediator类型的服务,然后我们调用Publish方法来发布消息。Send()方法是用来发布一对一消息的,而Publish()方法是用来发布一对多消息的。

    cs 复制代码
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class DemoController : ControllerBase
    {
        private readonly IMediator mediator;
    
        public DemoController(IMediator mediator)
        {
            this.mediator = mediator;
        }
    
        [HttpGet]
        public ActionResult Get()
        {
            await mediator.Publish(new PostNotification("你好呀" + DateTime.Now));
            return Ok();
        }
    }
注意

如果使用await来调用Publish,程序会等待所有事件处理者的Handle方法执行完成才继续向后执行,因此事件发布者和事件处理者的代码是运行在相同的调用堆栈中的,这样可以轻松实现强一致性的事务。如果不需要等待事件处理者的执行,可以不使用await来在调用Publish;即使使用await调用Publish发布事件,如果某个事件处理者的代码执行太耗时,为避免影响用户体验,可以在事件处理者的Handle方法中异步执行事件的处理逻辑。如果不等待事件处理者,就要处理事务的最终一致性。

相关推荐
金士顿7 天前
ASP.NET Core Native AOT + systemd 实战:把 Linux ARM64 程序变成可靠的设备服务
linux·嵌入式·asp.net core·arm64
金士顿8 天前
System.Text.Json Source Generator 深度解析:为什么 Native AOT 不喜欢反射
linux·asp.net core·arm64·net·native aot
金士顿8 天前
ASP.NET Core Native AOT 到底是什么?从 C#、IL、JIT 一直讲到 Linux ARM64 ELF
嵌入式·asp.net core
金士顿11 天前
ASP.NET Core BackgroundService 深度解析:设备后台任务到底应该怎么设计
linux·嵌入式·asp.net core·arm64
xixingzhe219 天前
SpringBoot DDD 实战入门文档
spring boot·spring·ddd
rolt19 天前
用UML表示的行业标准02汽车-AUTOSAR
软件工程·ddd·uml·领域驱动设计·ontology·本体
李燚24 天前
把规则搬回家:三个 BC 的贫血→充血重构实录(第103篇)
golang·agent·ddd·领域驱动设计·eino·deepflux·eino adk
YDS8291 个月前
大营销平台 —— 第二阶段应用接口实现
java·spring boot·ddd
YDS8292 个月前
大营销平台 —— 细节优化和前端对接
java·springboot·ddd
YDS8292 个月前
大营销平台 —— 架构解析和抽奖流程串联
java·springboot·ddd