3

鉴于我有两个限界上下文

  1. Fleet Mgt - 基于简单 CRUD 的支持子域
  2. 销售 - 这是我基于 CQRS 的核心领域

当车队管理中发生 CRUD 操作时,应发布反映该操作的事件:

  • 飞机创造
  • 飞机已更新
  • 飞机已删除
  • 等等

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

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

4

2 回答 2

0

根据 Ncqrs 的主要贡献者 Pieter 的说法,没有办法开箱即用地做到这一点。

在这种情况下,我不想经历创建和执行命令的整个过程,然后从事件存储中加载聚合根以让它发出事件。

行为是简单的 CRUD,使用最简单的解决方案实现,在这种特定情况下是使用实体框架的表单数据。我唯一需要的是在交易发生后发布一个事件。

我的解决方案如下所示:

// 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 { ... });
于 2011-10-19T15:22:55.710 回答
0

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

记住这一点,您不需要在销售 BC 中使用索引表(我知道这些是用于查询的)。您需要飞机的 GUID,并且只需要在读取端进行查找/连接。

For auditing I would just add a generic audit event via reflection in the repositories/unit of work.

于 2011-10-20T00:08:09.020 回答