小编JD *_*toy的帖子

如何在CQRS中处理基于集合的一致性验证?

我有一个相当简单的域模型,涉及Facility聚合根列表.鉴于我正在使用CQRS和事件总线来处理从域引发的事件,您如何处理集合上的验证?例如,假设我有以下要求:

  1. Facility必须有一个独特的名字.

由于我在查询端使用最终一致的数据库,因此在事件处理或处理事件时,其中的数据不能保证准确.

例如,a FacilityCreatedEvent在查询数据库事件处理队列中等待处理并写入数据库.将新的CreateFacilityCommand内容发送到要处理的域.域服务查询读取数据库以查看是否Facility已经注册了具有该名称的任何其他数据库,但返回false,因为CreateNewFacilityEvent尚未处理并写入存储.新的CreateFacilityCommand将成功并抛出另一个FacilityCreatedEvent当事件处理器尝试将其写入数据库并发现另一个Facility已存在该名称时会爆炸.

validation domain-driven-design eventual-consistency cqrs

28
推荐指数
2
解决办法
2695
查看次数

CQRS + DDD +事件采购中的集合间通信

在使用事件源聚合后端构建在DDD原则的环境中,如何将单独的聚合根(AR)相互通信?

例如,我有一个Facility聚合根(AR),它有一个负责创建BookingAR 的工厂方法.这BookingPersonAR和FacilityAR 的时间敏感组合.A Person只能预订一个Facility.

在DDD中,我会保留对Bookingin PersonPersonin的引用Facility.但是,当生成用于事件源的事件时,我认为尝试从后端处理事件反序列化将变得令人望而却步.因此,我只采用了对基于对象的值唯一id的引用.然而,这会带来一个新问题,当AR上的方法需要在另一个AR上调用另一个方法时 - 您如何处理这种情况?从域AR命中事件源存储库?

这种情况下的一般用例是什么?我接近这一切都错了吗?

domain-driven-design cqrs event-sourcing

25
推荐指数
1
解决办法
6903
查看次数

事件源聚合根是否应该访问事件源库?

我正在使用应用程序/域层中的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)

domain-driven-design repository cqrs

5
推荐指数
1
解决办法
4305
查看次数

SQL Server 2012(或SSIS)如何在完成任务后通知NServiceBus?

我们有一些非常长的运行ETL包(有些运行了几个小时)需要由NServiceBus端点启动.我们不需要为整个过程保持单个事务处于活动状态,并且可以将其分解为较小的事务.由于NServiceBus处理程序将自己包装在整个事务中,因此我们不希望在单个事务中处理它,因为它会超时 - 更不用说在DBMS中创建锁定问题了.

我目前的想法是,我们可以异步生成另一个进程,立即从处理程序返回,并在完成时发布一个事件(成功或失败).我没有找到很多关于如何将新的NServiceBus 4.0 SQL Server Broker支持与传统的MSMQ传输集成的文档.这甚至可能吗?

SQL Server 2012(或SSIS包)中长时间运行的进程在以异步方式完成时通知NServiceBus订阅者的首选方法是什么?

ssis nservicebus sql-server-2012

4
推荐指数
1
解决办法
567
查看次数