Dav*_*her 8 domain-driven-design cqrs dddd
我试图让我的头周围DDDD在格雷格-年轻的风格.
关于如何使用CQRS + EventSourcing实现DDDD有很多话题,并且有一些示例实现......总而言之,它可能会令人困惑......
在Gregs视图中,聚合没有getter或setter - 只是发出相应事件的状态更改方法.
Basicly一个事件 decribes一个状态转换,在过去happend.它的数据描述了改变了什么.
有人说,这些数据可以通过其他数据" 丰富 ".
当这些额外的数据可以来从?
即我有- 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;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果我想用Usergroup的名称 " 丰富 " 事件(出于调试原因或类似的事情),我该怎么做?
注射这样的事情库成User
是不允许的(我说的对吗?!? ),像
而且(一点偏离主题,但样本在这里)
AddToUsergroup
采取的Guid ,而不是一个的全聚合根?期待您的回答!
Lg
warappa
是否应该将存储库注入聚合根?
不,在这种情况下没有必要.将域服务传递给聚合上的行为方法可能是合适的,但在这种情况下不再需要.
事件是否应仅使用通过参数和聚合的内部状态提供的数据?
是的,原始域事件应该是这样的,它可以由聚合容易地构建,并且可以以确定的方式重放.
事件是否只包含描述状态变化的最小数据?
是.但是,为了满足外部用户的需求,这就是内容丰富程序发挥作用的地方.要从外部调度域事件,首先将其提交到事件存储,然后您可以在相同的tx中调度,或者具有在外部发布事件的进程外机制.在外部发布时,您通常会使用不同的邮件合同,因为订阅者可能需要的内容比域事件本身更多.在这种情况下,您需要用户组名称.然后,发布者可以提取用户组名称并将该数据放入丰富的事件中.此发布者可以访问用户组的读取模型存储库,以便检索该名称.
AddToUsergroup应该使用Guid而不是完整的聚合根吗?
是.传递整个聚合可能是不可能的,并且还会产生一种错觉,即可能会使用ID之外的其他内容,但情况并非如此.
归档时间: |
|
查看次数: |
798 次 |
最近记录: |