如何解决事件来源-澄清何时将事件添加到事件存储
编辑
所讨论的体系结构已完全失效。花了一些时间后,我偶然发现了这篇文章,该文章对了解事件来源非常有帮助:https://codepen.io/varzin/pen/rFfhH
编辑结束
我正在建立基于DDD,事件源和CQRS的系统。我有两个数据库和两个实体框架上下文。第一个数据库用于规范化数据,第二个用于事件。
我还有以下汇总根:
public class Order : Entity,IAggregateRoot
{
private Order()
{
this.AddDomainEvent(new OrderCreatedDomainEvent(this));
}
public static Order CreateOrder => new Order();
}
使用MediatR,我具有以下“创建订单”命令处理程序:
public class CreateOrderCommandHander : ICommandHandler<CreateOrderCommand>
{
private readonly IOrderRepository _orderRepository;
public async Task<Unit> Handle(CreateOrderCommand request,CancellationToken cancellationToken)
{
// Creating new order which has OrderCreatedDomainEvent domain event
var order = Order.CreateOrder();
this._orderRepository.AddOrder(order);
// Saving created order
await this._orderRepository.UnitOfWork.SaveChangesAsync();
//...
}
}
我的问题是-OrderCreatedDomainEvent
事件究竟何时触发并因此添加到事件存储中?是在之前还是之后使用IOrderRepository
(规范化数据数据库)添加并保存新记录?
如果我不得不猜测-之前,由于事件存储是事实的来源,因此它必须始终包含系统的最新状态。如果我要先将记录添加到Normalized数据库中,则事件存储将不同步。
在http://www.andreavallotti.tech/en/2018/01/event-sourcing-and-cqrs-in-c/中,有一个Commit
函数可在将保存任何内容到规范化数据库之前调度域事件。这是正确的方法还是仅仅是可能的方法之一?
解决方法
有点奇怪的设置。
我一直解决的方法是将事件生成为第一步。然后,任何关系预测都可以订阅他们感兴趣的事件并将其保存下来。
您将要考虑丢失或顺序错误的邮件。您会发现在某些时候您需要重播所有事件-构建投影以处理此事件是一个好主意。
一种方法是将这些事件的本地副本与投影一起存储,然后可以判断事件是最新事件还是历史事件,可能需要不同的逻辑(如果需要,可以重写过去)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。