我正试图以Greg Young 的风格了解DDDD。
有很多关于如何使用 CQRS+EventSourcing 实现 DDDD 的讨论,并且有一些示例实现......总之它可能会很混乱......
在 Gregs 视图中,聚合没有 getter 或 setter - 只是发出相应事件的状态更改方法。
基本上,一个事件描述了过去发生的状态转换。它的数据描述了发生了什么变化。
有人说,这些数据可以通过附加数据来“丰富” 。这些额外的数据
从哪里来?
即我有User
和Usergroup
-两个聚合根(可以独立存在,有身份)。User
有一个方法叫做AddToUsergroup
.
public class User : AggregateRoot
{
// ...
public void AddToUsergroup(Usergroup usergroup)
{
// validate state
RaiseEvent(new UserJoinedUsergroup(this.Id, usergroup.Id));
}
// ...
}
public class Usergroup : AggregateRoot
{
private string _displayName;
// ...
public void ChangeDisplayName(string displayName)
{
// validate state
RaiseEvent(new DisplayNameChanged(this.Id, displayName));
}
public void Apply(DisplayNameChanged e)
{
this._displayName = e.DisplayName;
}
// ...
}
如果我想用用户组的名称“丰富”事件(出于调试原因或类似原因),我该怎么做?
- 吸气剂不存在
- 用户组的内部状态不可访问
不允许将诸如存储库之类User
的东西注入(我在这里吗?!?),例如
- 读取端存储库
- 事件存储库
底线问题:
能是否应该注入诸如存储库之类的东西来聚合根?- 事件是否应该只使用通过参数和聚合的内部状态可用的数据?
- 事件是否应该只包含描述状态变化的最少数据?
而且(有点离题,但样本在这里)
- 应该
AddToUsergroup
采用Guid 而不是完整的聚合根?
期待您的回答!
华拉巴