如何设计并实现一个.NET高级开发中的事件总线框架?
摘要:作者博客地址: https:www.whuanle.cn https:www.cnblogs.comwhuanle .NET 高级开发系列教程地址: https:docs.whuanle.cnzhmaomi_framewo
作者博客地址:
https://www.whuanle.cn
https://www.cnblogs.com/whuanle
.NET 高级开发系列教程地址:
https://docs.whuanle.cn/zh/maomi_framework
目录事件总线使用事件总线事件总线的设计接口抽象执行器封装封装调用链事件扫描和注册使用事务处理事件
事件总线
事件总线常常作为软件开发中解耦各个组件通讯的工具。在领域驱动设计的开发过程中,由于系统存在多个模块,为了避免各个模块的函数直接进行调用,使用事件总线作为媒介进行模块间的通讯,解耦模块之间的依赖。
在本章中我们将会学习如何编写一个事件总线框架,本文参考了一些 MASA Framework 框架中对于事件总线的设计。
使用事件总线
在编写事件总线框架之前,首先了解 Maomi.EventBus 的使用,其示例代码参考 Demo8.Console 项目。
创建一个项目,然后通过 nuget 引入 Maomi.EventBus 包。
这里我们来模拟用户注册的流程,模拟用户注册流程。假设用户提交信息后,系统的处理过程是检查验证码、将用户信息写到 Users 表中、初始化用户数据、发送电子邮箱。
首先是定义一个事件模型类,模型类必须继承 Event 抽象类或 IEvent 接口。
public record class MyEvent : Event
{
public string Name { get; set; }
public string EMail { get; set; }
public override string ToString()
{
return $"用户名: {Name} ,邮箱: {EMail}";
}
}
接着要编写事件执行器,在 Maomi.EventBus 中,事件执行器是一个方法,而不是一个类型,事件执行器方法命名没有约束,只要求方法参数包含 MyEvent 事件即可,执行器方法所在的类型不需要继承任何接口,只需要使用 EventAttribute 特性标记即可。
首先是检查用户的验证码是否正确:
[Event] // 标记此类型里有事件处理器
public class CheckImageCodeEventHandler
{
// 标记该方法是事件处理器,并设置执行顺序
[EventHandler(Order = 0)]
public void Check(MyEvent @event)
{
Console.WriteLine(@event.ToString());
}
}
当框架扫描到 CheckImageCodeEventHandler 带有 Event 标识时,会被自动注册到容器中,其生命周期为 scope。由于 CheckImageCodeEventHandler 被注册到容器中,所以可以在其构造函数中注入其它服务。
[EventHandler(Order = 0)] 定义触发事件后该执行器的执行顺序。每个事件都有多个执行器,它们之间是有顺序的,通过 EventHandlerAttribute.Order 属性进行排序。一个类型中可以有多个执行器方法,可以订阅同一个事件,也可以订阅不同的事件。每个执行器方法都有一个对应顺序的的撤销器器,由于回滚撤销之前的操作。
