我有一个相当简单的域模型,涉及Facility聚合根列表.鉴于我正在使用CQRS和事件总线来处理从域引发的事件,您如何处理集合上的验证?例如,假设我有以下要求:
Facility必须有一个独特的名字.由于我在查询端使用最终一致的数据库,因此在事件处理或处理事件时,其中的数据不能保证准确.
例如,a FacilityCreatedEvent在查询数据库事件处理队列中等待处理并写入数据库.将新的CreateFacilityCommand内容发送到要处理的域.域服务查询读取数据库以查看是否Facility已经注册了具有该名称的任何其他数据库,但返回false,因为CreateNewFacilityEvent尚未处理并写入存储.新的CreateFacilityCommand将成功并抛出另一个FacilityCreatedEvent当事件处理器尝试将其写入数据库并发现另一个Facility已存在该名称时会爆炸.
在使用事件源聚合后端构建在DDD原则的环境中,如何将单独的聚合根(AR)相互通信?
例如,我有一个Facility聚合根(AR),它有一个负责创建BookingAR 的工厂方法.这Booking是PersonAR和FacilityAR 的时间敏感组合.A Person只能预订一个Facility.
在DDD中,我会保留对Bookingin Person和Personin的引用Facility.但是,当生成用于事件源的事件时,我认为尝试从后端处理事件反序列化将变得令人望而却步.因此,我只采用了对基于对象的值唯一id的引用.然而,这会带来一个新问题,当AR上的方法需要在另一个AR上调用另一个方法时 - 您如何处理这种情况?从域AR命中事件源存储库?
这种情况下的一般用例是什么?我接近这一切都错了吗?
我正在使用应用程序/域层中的DDD来处理事件源 CQRS实现.我有一个如下所示的对象模型:
public class Person : AggregateRootBase
{
private Guid? _bookingId;
public Person(Identification identification)
{
Apply(new PersonCreatedEvent(identification));
}
public Booking CreateBooking() {
// Enforce Person invariants
var booking = new Booking();
Apply(new PersonBookedEvent(booking.Id));
return booking;
}
public void Release() {
// Enforce Person invariants
// Should we load the booking here from the aggregate repository?
// We need to ensure that booking is released as well.
var booking = BookingRepository.Load(_bookingId);
booking.Release();
Apply(new PersonReleasedEvent(_bookingId));
}
[EventHandler]
public void Handle(PersonBookedEvent @event) …Run Code Online (Sandbox Code Playgroud) 我们有一些非常长的运行ETL包(有些运行了几个小时)需要由NServiceBus端点启动.我们不需要为整个过程保持单个事务处于活动状态,并且可以将其分解为较小的事务.由于NServiceBus处理程序将自己包装在整个事务中,因此我们不希望在单个事务中处理它,因为它会超时 - 更不用说在DBMS中创建锁定问题了.
我目前的想法是,我们可以异步生成另一个进程,立即从处理程序返回,并在完成时发布一个事件(成功或失败).我没有找到很多关于如何将新的NServiceBus 4.0 SQL Server Broker支持与传统的MSMQ传输集成的文档.这甚至可能吗?
SQL Server 2012(或SSIS包)中长时间运行的进程在以异步方式完成时通知NServiceBus订阅者的首选方法是什么?