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 天前
微服务架构学习与思考(15):微服务拆分的原则、时机、方法以及常见问题
微服务·ddd·微服务架构·架构设计
lazy★boy13 天前
DDD与MVC扩展能力对比
mvc·ddd
EdisonZhou16 天前
使用MCP C# SDK开发MCP Server + Client
llm·aigc·asp.net core·.net core
Jayden18 天前
Spring Boot 实战:DDD 分层架构落地全解析
spring boot·ddd·ddd架构·ddd落地
超软毛毛虫1 个月前
ASP.NET Core 模型验证消息的本地化新姿势
asp.net core·localization
蜗牛沐雨2 个月前
在 Go 中实现事件溯源:构建高效且可扩展的系统
服务器·golang·ddd·事件驱动·领域驱动
lixww.cn2 个月前
ASP.NET Core SignalR向部分客户端发消息
javascript·websocket·vue·asp.net core·signalr
lixww.cn2 个月前
ASP.NET Core SignalR的协议协商
asp.net core·signalr
lixww.cn2 个月前
ASP.NET Core SignalR的分布式部署
redis·消息队列·asp.net core·signalr