/eda-demo

事件驱动架构

Primary LanguageC#

事件驱动架构Demo

准备

  1. 需要RabbitMQ
  2. .NET Core 2.2开发环境

运行

  1. 运行MST.API, 运行MST.Serivces.Notification(可选)
  2. 运行Powershell命令行, 增加一位Customer
    Invoke-RestMethod 'http://localhost:5000/api/Customers' -Method Post  
  3. 观察Log.txt的日志内容

项目分层

分层定义

API是控制器, 处理请求. 引用了 Domain.Core定义了一些核心逻辑抽象 Domain定义了核心的业务逻辑, 以及这些业务逻辑所需的抽象. 引用Domain.Core EventBus.Simple实现了一个简单的事件总线. 引用Domain EventBus.RabbitMQ使用RBMQ实现了另一个简单的事件总线. 引用Domain EventHandlerContext.Simple实现了一个简单的事件处理上下文. 引用Domain EventStore.Simple实现了一个简单的事件存储. 引用Domain

Domain.Core层定义

  1. 定义了事件的相关抽象

    1. IEvent 事件
    2. IEventPublisher 事件发布器
    3. IEventHandler 事件处理器
    4. IEventSubscriber 事件处理订阅, 用来注册事件和它的处理类
    5. IEventHandlerExecutionContext 事件处理上下文, 执行实现处理器定义的操作
    6. IEventBus 事件总线, 继承了事件订阅和事件发布抽象. 它是一个中介. 持有事件处理器上下文
    7. IEventStore 事件存储
    8. BaseEventBus 事件总线基类
  2. 定义了领域相关的抽象

    1. IDomainEvent 领域事件接口, 继承IEvent. 定义了一些聚合信息
    2. DomainEvent 领域事件抽象类实现
    3. AggregateCreatedEvent 聚合创建事件, 一个领域事件的创建
    4. IEntity 实体
    5. IPurgeble 可清空
    6. IPersistedVersionSetter 实体的版本号设置

运行过程

1. 控制器层注入了事件处理上下文, 事件总线, 事件仓储
2. 控制器层在管道中定义几个事件处理者, 并在事件总线上注册
3. 控制器接受一个创建聚合的Command
4. 在Command执行完毕后创建一个"聚合已创建事件"
5. 该事件被发布到事件总线中, 事件总线中找到处理器类进行处理
6. 每个接收者使用事件处理上下文处理事件
7. 事件处理器处理事件, 并确定是否需要发布新的事件