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

相关推荐
Kookoos4 天前
“事件风暴 → 上下文映射 → 模块化”在 ABP vNext 的全链路模板
ddd·ef core·abp vnext·事件风暴·oasdiff
ArabySide7 天前
【ASP.NET Core】分布式场景下ASP.NET Core中JWT应用教程
分布式·后端·asp.net core
Light6010 天前
领码方案|微服务与SOA的世纪对话(3):方法论新生——DDD、服务网格与AI Ops的融合之道
运维·人工智能·微服务·ddd·soa·服务网格·ai ops
绿荫阿广13 天前
用纯.NET开发并制作一个智能桌面机器人(六):使用.NET开发一个跨平台功能完善的小智AI客户端
c#·.net·asp.net core·maui·winui
xiangji13 天前
PocoEmit遥遥领先于AutoMapper之打通充血模型的任督二脉
ioc·ddd·expression·类型转化
Light6014 天前
领码方案|微服务与SOA的世纪对话(1):从“大一统”到“小而美”
微服务·ddd·soa·服务网格·ai ops
rolt17 天前
[pdf、epub]320道《软件方法》强化自测题业务建模需求分析共279页(202509更新)
产品经理·ddd·架构师·uml·领域驱动设计
冷冷的菜哥1 个月前
ASP.NET Core文件分片上传
c#·asp.net·asp.net core·文件分片上传
冷冷的菜哥1 个月前
ASP.NET Core上传文件到minio
后端·asp.net·上传·asp.net core·minio
ArabySide1 个月前
【ASP.NET Core】双Token机制在ASP.NET Core中的实现
后端·asp.net core