事件驱动架构Demo
准备
- 需要RabbitMQ
- .NET Core 2.2开发环境
运行
- 运行MST.API, 运行MST.Serivces.Notification(可选)
- 运行Powershell命令行, 增加一位Customer
Invoke-RestMethod 'http://localhost:5000/api/Customers' -Method Post
- 观察Log.txt的日志内容
项目分层
分层定义
API是控制器, 处理请求. 引用了 Domain.Core定义了一些核心逻辑抽象 Domain定义了核心的业务逻辑, 以及这些业务逻辑所需的抽象. 引用Domain.Core EventBus.Simple实现了一个简单的事件总线. 引用Domain EventBus.RabbitMQ使用RBMQ实现了另一个简单的事件总线. 引用Domain EventHandlerContext.Simple实现了一个简单的事件处理上下文. 引用Domain EventStore.Simple实现了一个简单的事件存储. 引用Domain
Domain.Core层定义
-
定义了事件的相关抽象
IEvent
事件IEventPublisher
事件发布器IEventHandler
事件处理器IEventSubscriber
事件处理订阅, 用来注册事件和它的处理类IEventHandlerExecutionContext
事件处理上下文, 执行实现处理器定义的操作IEventBus
事件总线, 继承了事件订阅和事件发布抽象. 它是一个中介. 持有事件处理器上下文IEventStore
事件存储BaseEventBus
事件总线基类
-
定义了领域相关的抽象
IDomainEvent
领域事件接口, 继承IEvent. 定义了一些聚合信息DomainEvent
领域事件抽象类实现AggregateCreatedEvent
聚合创建事件, 一个领域事件的创建IEntity
实体IPurgeble
可清空IPersistedVersionSetter
实体的版本号设置
运行过程
1. 控制器层注入了事件处理上下文, 事件总线, 事件仓储
2. 控制器层在管道中定义几个事件处理者, 并在事件总线上注册
3. 控制器接受一个创建聚合的Command
4. 在Command执行完毕后创建一个"聚合已创建事件"
5. 该事件被发布到事件总线中, 事件总线中找到处理器类进行处理
6. 每个接收者使用事件处理上下文处理事件
7. 事件处理器处理事件, 并确定是否需要发布新的事件