Skip to content

领域事件处理

领域事件处理器是一个因特定目的而处理领域事件的处理逻辑,一个领域事件处理器应该仅针对一个目的来处理领域事件,针对同一领域事件的不同目的应该有不同的领域事件处理器。

定义领域事件处理器

  1. 安装nuget包 NetCorePal.Extensions.Domain.Abstractions

    dotnet add package NetCorePal.Extensions.Domain.Abstractions
    
  2. 领域事件处理器是一个实现了IDomainEventHandler<TDomainEvent>接口的类,其中TDomainEvent是领域事件的类型。

下面是一个领域事件处理器的例子:

```csharp
public class OrderCreatedDomainEventHandler(IMediator mediator) : IDomainEventHandler<OrderCreatedDomainEvent>
{
    public Task Handle(OrderCreatedDomainEvent notification, CancellationToken cancellationToken)
    {
        return mediator.Send(new DeliverGoodsCommand(notification.Order.Id), cancellationToken);
    }
}
```

领域事件处理器必须

  • 领域事件处理器必须是幂等的,即多次处理同一领域事件,结果应该是一致的。
  • 领域事件处理器必须是无状态的,即不应该有任何状态,所有的状态应该通过领域事件传递。

备注: 在我们的框架中,领域事件处理器是同步执行的,并且其调用的Command与触发领域事件的CommandHandler处于同一事务中

领域事件处理器可以

  • 领域事件处理器中可以使用MediatR框架来发送命令;
  • 领域事件处理器中可以做一些简单的数据转换和信息查询;
  • 领域事件处理器中可以调用外部服务来完成一些信息组织和验证;
  • 领域事件处理器中可以发出集成事件来将事件传递给其它系统;

领域事件处理器不要

  • 领域事件处理器中不要包含领域模型的操作,应该由CommandHandler操作领域模型并持久化;

备注: 由于我们框架仅对CommandHandler做了事务管理,对于领域事件处理器中的操作框架不会做SaveChangesAsync,从而导致领域事件处理器中的操作不会被保存到数据库中