鉴于我有两个 Bounded Contexts :
当车队管理中发生CRUD操作时,应发布反映该操作的事件:
需要这些事件a)更新Sales域中所需的各种索引表,以及b)提供统一的审计日志。
问题:有没有简单的方法来存储和发布这些事件(InProcessEventBus
,我没有在这里使用NSB),而不通过AggregateRoot
,在简单的CRUD环境中我不需要它。
答案 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,并且只需在读取端查找/加入。
对于审计,我只需通过存储库/工作单元中的反射添加通用审计事件。