Ncqrs:如何在没有聚合根的情况下引发事件

时间:2011-10-19 12:43:02

标签: domain-driven-design cqrs ncqrs

鉴于我有两个 Bounded Contexts

  1. Fleet Mgt - 简单的基于CRUD的支持子域
  2. 销售 - 这是我基于CQRS的核心域
  3. 当车队管理中发生CRUD操作时,应发布反映该操作的事件:

    • AircraftCreated
    • AircraftUpdated
    • AircraftDeleted

    需要这些事件a)更新Sales域中所需的各种索引表,以及b)提供统一的审计日志。

    问题:有没有简单的方法来存储和发布这些事件(InProcessEventBus,我没有在这里使用NSB),而不通过AggregateRoot,在简单的CRUD环境中我不需要它。

2 个答案:

答案 0 :(得分:0)

根据Ncqrs的主要贡献者Pieter的说法,没有办法开箱即用。

在这种情况下,我不想完成创建和执行命令的整个仪式,然后从事件存储加载聚合根只是为了让它发出事件。

行为是简单的CRUD,使用最简单的解决方案实现,在这种特定情况下,使用Entity Framework的数据形式。我唯一需要的是在事务发生后发布事件。

我的解决方案如下:

// Abstract base class that provides a Unit Of Work

public abstract class EventPublisherMappedByConvention 
    : AggregateRootMappedByConvention
{
    public void Raise(ISourcedEvent e)
    {
        var context = NcqrsEnvironment.Get<IUnitOfWorkFactory>()
            .CreateUnitOfWork(e.EventIdentifier);
        ApplyEvent(e);
        context.Accept();
    }
}

// Concrete implementation for my specific domain
// Note: The events only reflect the CRUD that's happened.
// The methods themselves can stay empty, state has been persisted through
// other means anyway.

public class FleetManagementEventSource : EventPublisherMappedByConvention
{
    protected void OnAircraftTypeCreated(AircraftTypeCreated e) { }
    protected void OnAircraftTypeUpdated(AircraftTypeUpdated e) { }
    // ...
}

// This can be called from anywhere in my application, once the 
// EF-based transaction has succeeded:

new FleetManagementEventSource().Raise(new AircraftTypeUpdated { ... });

答案 1 :(得分:0)

如果你想发布关于某事的事件,这个东西可能是一个聚合根,因为它是一个关于感兴趣的束的外部识别对象,否则你为什么要跟踪它们呢?

记住这一点,您不需要销售BC中的索引表(我理解这些是用于查询)。您需要飞机的GUID,并且只需在读取端查找/加入。

对于审计,我只需通过存储库/工作单元中的反射添加通用审计事件。