首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ncqrs:如何在没有聚合根的情况下引发事件

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

Stack Overflow用户
提问于 2011-10-19 12:43:02
回答 2查看 783关注 0票数 3

假设我有两个有界的上下文

简单的基于CRUD的支持sub-domain

  • Sales --这是我的基于CQRS的核心域

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

  • AircraftCreated
  • AircraftUpdated
  • AircraftDeleted
  • etc.

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-19 15:22:55

根据Ncqrs的主要贡献者Pieter的说法,这是不可能的。

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

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

我的解决方案如下:

代码语言:javascript
复制
// 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 { ... });
票数 0
EN

Stack Overflow用户

发布于 2011-10-20 00:08:09

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

请记住,在sales中不需要索引表(我了解这些表是用于查询的)。您需要飞机的GUID,只需要读取侧的查找/连接。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7821496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档