Domain driven design 事件数据

Domain driven design 事件数据,domain-driven-design,cqrs,dddd,Domain Driven Design,Cqrs,Dddd,我正试着用格雷格·杨的风格来左右我的头脑 关于如何使用CQRS+EventSourcing实现DDDD有很多讨论,并且有一些示例实现。。。总的来说,这会让人很困惑 在Gregs视图中,聚合没有getter或setter——只是发出相应事件的状态更改方法 基本上,一个事件描述了过去发生的状态转换。它的数据描述了发生了什么变化 有人说,这些数据可以通过其他数据“丰富” 这些附加数据从哪里来 i、 e.我有用户和用户组-两个聚合根(可以独立存在,具有身份)User有一个名为AddToUsergroup

我正试着用格雷格·杨的风格来左右我的头脑

关于如何使用CQRS+EventSourcing实现DDDD有很多讨论,并且有一些示例实现。。。总的来说,这会让人很困惑

在Gregs视图中,聚合没有getter或setter——只是发出相应事件的状态更改方法

基本上,一个事件描述了过去发生的状态转换。它的数据描述了发生了什么变化

有人说,这些数据可以通过其他数据“丰富”
这些附加数据从哪里来

i、 e.我有
用户
用户组
-两个聚合根(可以独立存在,具有身份)
User
有一个名为
AddToUsergroup
的方法

公共类用户:AggregateRoot
{
// ...
public void AddToUsergroup(用户组用户组)
{
//验证状态
RaiseEvent(新UserJoinedUsergroup(this.Id,usergroup.Id));
}
// ...
}
公共类用户组:AggregateRoot
{
私有字符串_displayName;
// ...
公共无效ChangeDisplayName(字符串displayName)
{
//验证状态
RaiseEvent(新的DisplayNameChanged(this.Id,displayName));
}
公共无效应用(显示名称已更改)
{
这个._displayName=e.displayName;
}
// ...
}
如果我想用用户组的名称“丰富事件”(出于调试原因或类似原因),我将如何做

  • getter不存在
  • 用户组的内部状态为不可访问
存储库之类的东西注入
用户
不允许的我在这里吗?),比如

  • 读端存储库
  • 事件存储库
底线问题:
  • 存储库这样的东西是否可以注入来聚合根
  • 事件是否应仅使用通过聚合的参数和内部状态可用的数据
  • 事件是否应仅包含描述状态更改的最小数据
和(有点离题,但示例在这里)

  • AddToUsergroup
    是否应该采用Guid而不是完全聚合根
期待您的回答

Lg
瓦拉帕

是否应该向聚合根注入类似于存储库的内容

不,在这种情况下,没有必要这样做。将域服务传递给聚合上的行为方法是合适的,但在这种情况下也不需要

事件是否应仅使用通过参数和内部 总量状况

是的,原始域事件应该是这样的:它可以很容易地由聚合构建,并且可以以确定的方式重放

事件是否应仅包含描述事件的最小数据 国家改变

对。然而,为了满足外部订阅者的需求,这是发挥作用的地方。要从外部分派域事件,首先将其提交到事件存储,然后您可以在相同的发送中分派,或者使用进程外机制从外部发布事件。在对外发布时,您通常会对消息使用不同的契约,因为订阅者可能需要比域事件本身更多的契约。在这种情况下,您需要用户组名。然后,发布者可以调出用户组名称并将该数据放入丰富的事件中。此发布者可以访问用户组的读取模型存储库,从而允许其检索名称

AddToUsergroup是否应该采用Guid而不是完整的聚合根


对。传递整个聚合可能是不可能的,并且还会产生一种错觉,即可能会使用ID以外的其他东西,但事实并非如此。

我可以帮助您解决这个离题问题。。您应该只将Guid传递给方法,而不是聚合根。关于“底线问题”。在我的用法中,事件应该包含业务案例所需的最少信息量。它应该只包含来自聚合本身的数据。ie:通过参数或内部状态传递。@Sarmaad谢谢!你强化了我的假设!感谢您的解释,特别是对内容丰富器的澄清!