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方法中异步执行事件的处理逻辑。如果不等待事件处理者,就要处理事务的最终一致性。

相关推荐
魏杨杨2 天前
被流量逼出来的架构:从一台服务器到云原生的 17 次蜕变 —— 集群、缓存、MQ、微服务、Docker、K8S 的前世今生
微服务·k8s·负载均衡·ddd·分部署
Esofar6 天前
Dddify:给 ASP.NET Core 项目一套轻量、清晰、可落地的 DDD 基础设施
c#·ddd·asp.net core·cqrs·dddify·clean architecture
weixin_4223293112 天前
一文学会DDD领域驱动设计
ddd·领域设计
CSharp精选营14 天前
.NET 8 Web开发入门(三):解构引擎——依赖注入(DI)与中间件管道
中间件·asp.net core·依赖注入·ioc容器·请求管道·服务生命周期
rolt24 天前
[幻灯片]分析设计高阶-02结构(2)-202604更新
ddd·架构师·uml·ooad
刀法如飞1 个月前
一款Python语言Django框架DDD脚手架,助你快速搭建项目
python·ddd·脚手架
YDS8291 个月前
大营销平台 —— 模板方法串联前中置抽奖规则
java·spring boot·ddd
医疗信息化王工1 个月前
基于ASP.NET Core的医院输血审核系统设计与实现
后端·mvc·asp.net core·输血审核
YDS8291 个月前
大营销平台 —— 抽奖规则决策树
java·springboot·ddd
医疗信息化王工1 个月前
基于ASP.NET Core的住院日志统计系统设计与实现
后端·layui·asp.net core·npoi·dapper