0%

事件总线(领域设计)

领域设计是个好东西, 但看了好久都没怎么看懂. 就先从看懂的事件总线开始吧.

代码

什么是事件总线及事件总线在领域设计中扮演了什么角色

要讲事件总线就绕不开领域设计, 看来看去美团的文章[1]是写的比较好的, 请参照这个理解.

个人的粗见: 领域设计是一种由上而下指导的项目设计模式. 人们更加注重具体的事务, 将一个大领域细分为各个小领域 (例如: 医疗领域细分为: 教学领域, 内科领域, 外科领域, 行政领域等等, 当然也可以有其他的分法), 代码是为这些领域事务服务的, 而不像以前根据事务设计表或UI, 而代码是为表和UI服务的. (这部分还是看别人的文章理解好了, 就不再细讲了). 总结一下领域设计就是重回面向对象, 他是一种设计思想, 本身并没有引入新的技术.

而事件总线可以想象为领域设计中的四通八达高速公路, 一个请求进到系统后系统根据其所属的领域将其丢给对应的领域事件处理方法中去处理.

C# 实现

本文的代码参考张大神的文章[2]. 这是一个 C# console 项目.

注意: 本文注重与事件总线的实现, 而没按照领域设计的思想去建立工程.

image-20220716153328602

几个关键的文件作用如下:

文件 作用
IEventBus.cs 事件总线接口,负责 IEvent 的订阅和发布;
EventBus.cs IEventBus 的实现
IEvent.cs 标识接口, 用来约束事件要用到的对象
IEventHandler.cs 事件对象的处理方法, 行为
DealPublishModel.cs 保证每次发布事件都开辟独立的内存空间进行发布

事件的订阅和发布

在代码中, 事件处理方法以 <事件对象的类型, 事件对象的处理方法们> 的字典的形式存放在内存中, 系统启动后会最先加载 EventBus, 再加载订阅了事件的处理类如图中的 CreateOrderService.

CreateOrderService 在初始化的时候调用了 EventBus.Subscribe ( 即订阅事件 ), 它会把自身给传给 EventBus, EventBus 根据传入的参数的处理对象在字典中检索, 没有的话增加键值, 有的话在对应的值中加入新的处理方法. 这样就完成了事件的订阅.

当系统需要处理某个事件时, 就会封装好事件, 并将它推入事件总线 ( EventBus.Publish ), 由总线自动找处理的方法. 事件总线从字典中根据推入的事件对象的类型去搜索对应的值, 若找到了就调用相应的事件对象处理方法去处理该事件对象. 这样就完成了事件的发布.

综上: 一个服务可以订阅多个事件, 一个事件对象可以有多个事件对象处理方法, 多个事件对象处理方法是异步处理某个事件对象的. 当然了, 这些并不是硬性规定, 可以根据不同场景设计不一样的订阅, 发布, 事件处理方法.

具体就请看代码吧.

依赖

为了实现这些, 依赖了很多 C# 的特性. 这里稍微总结一下:

  1. 单例模式
  2. 多态
  3. ~

参考链接