假设我有两个有界的上下文
简单的基于CRUD的支持sub-domain
当船队管理中发生CRUD操作时,应公布反映该操作的事件:
这些事件需要:( a)更新销售域中需要的各种索引表;( b)提供统一的审计日志。
问题:如果没有一个简单的CRUD上下文中不需要的AggregateRoot,是否有一种简单的方法来存储和发布这些事件(在InProcessEventBus中,我在这里不使用NSB )。
发布于 2011-10-19 15:22:55
根据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-20 00:08:09
如果您想发布关于某件事的事件,这件事可能是一个聚合根,因为它是一个外部标识的对象,关于一堆感兴趣的东西,否则为什么要跟踪它们呢?
请记住,在sales中不需要索引表(我了解这些表是用于查询的)。您需要飞机的GUID,只需要读取侧的查找/连接。
对于审计,我只需通过存储库/工作单元中的反射添加一个一般的审计事件。
https://stackoverflow.com/questions/7821496
复制相似问题