DDD 如何设计涉及相关实体的 services/aggregate 根
DDD How to design services/aggregate roots involving related entities
我正在构建一个管理员只能邀请
的邀请系统
- 尚未邀请的用户
- 不在系统中的用户(=已经是会员)
此流程涉及两个实体 Invitation
和 User
。
- 删除用户不应删除他发送的邀请
- 更新用户的名字不应更新他的所有邀请
这似乎表明 Invitations
和 User
应该添加到两个单独的聚合中。
那么实现上述逻辑的唯一方法就是使用像IInvitationService
这样的域服务。 我说的对吗?
这个接口可以有两种方法:
public interface IInvitationService
{
Task<Result> Create(Invitation invitation, CancellationToken token);
Task<Result> Delete(Invitation invitation, CancellationToken token);
}
最后,如果我选择服务方式,我将有两种可能"ways"来创建邀请。
IInvitationRepository.Create()
IInvitationService.Create()
不觉得乱吗?
Then the only way to implement the logic described above is to use a domain service like IInvitationService. Am I right?
这里似乎出了点问题。总之,domain-driven-design并不意味着我们放弃面向对象设计的原则。
逻辑通常在正在变化的聚合根中实现。引入聚合模式的部分目的是为了更容易找到负责进行更改的代码——而不是让相同的代码散布在整个模型中,您只需考虑状态更改发生的位置并知道在哪里寻找代码。
聚合根本身只知道自己的状态 - 执行更改所需的任何其他信息都作为参数传递给它。
所以我通常不希望您需要 "domain service" 用于您目前描述的模型部分。
域服务可能发挥作用的情况是对一个聚合的更改取决于不同聚合的最新状态。例如,如果对 "invitation" 的特定更改取决于 "user" 的当前状态,那么您可能会向负责计算更改的邀请方法传递一个域服务,该域服务提供对缓存副本的访问权限用户状态。
至于创建...创建模式很奇怪。 Udi Dahan's post 是一个很好的起点。
我正在构建一个管理员只能邀请
的邀请系统- 尚未邀请的用户
- 不在系统中的用户(=已经是会员)
此流程涉及两个实体 Invitation
和 User
。
- 删除用户不应删除他发送的邀请
- 更新用户的名字不应更新他的所有邀请
这似乎表明 Invitations
和 User
应该添加到两个单独的聚合中。
那么实现上述逻辑的唯一方法就是使用像IInvitationService
这样的域服务。 我说的对吗?
这个接口可以有两种方法:
public interface IInvitationService
{
Task<Result> Create(Invitation invitation, CancellationToken token);
Task<Result> Delete(Invitation invitation, CancellationToken token);
}
最后,如果我选择服务方式,我将有两种可能"ways"来创建邀请。
IInvitationRepository.Create()
IInvitationService.Create()
不觉得乱吗?
Then the only way to implement the logic described above is to use a domain service like IInvitationService. Am I right?
这里似乎出了点问题。总之,domain-driven-design并不意味着我们放弃面向对象设计的原则。
逻辑通常在正在变化的聚合根中实现。引入聚合模式的部分目的是为了更容易找到负责进行更改的代码——而不是让相同的代码散布在整个模型中,您只需考虑状态更改发生的位置并知道在哪里寻找代码。
聚合根本身只知道自己的状态 - 执行更改所需的任何其他信息都作为参数传递给它。
所以我通常不希望您需要 "domain service" 用于您目前描述的模型部分。
域服务可能发挥作用的情况是对一个聚合的更改取决于不同聚合的最新状态。例如,如果对 "invitation" 的特定更改取决于 "user" 的当前状态,那么您可能会向负责计算更改的邀请方法传递一个域服务,该域服务提供对缓存副本的访问权限用户状态。
至于创建...创建模式很奇怪。 Udi Dahan's post 是一个很好的起点。