DDD - 使用在整个系统中必须唯一的联系信息对用户进行建模

时间:2015-10-09 08:51:07

标签: domain-driven-design cqrs domain-data-modelling

我需要澄清为用户建立身份和访问域的建模。用户域模型具有联系信息实体(实体因为它是可变的),客户可以注册电话号码,但可以选择在需要时更改它。

客户使用过的电话号码永远不会被任何其他用户使用。所以我相信模型必须允许查询phonenumber表(因为它与客户是多对一的,因为旧数字被停用并存档)。

如果创建域服务是可以的,那么存储库应该是什么,因为没有识别出聚合。 在这些情况下,我有一个客户(用户)聚合,但允许查询所有用户,看看客户提供的电话号码是否已被其他人使用,聚合应该是什么,或者我可以写一个DomainService,只是可以直接查询数据库到phonenumber表来检查它的唯一性,我是否违反任何DDD原则这样做,有什么更清洁的选择。

2 个答案:

答案 0 :(得分:3)

另一种方法是创建一个Aggregate,使其明确指定要保留唯一约束的范围。

作为(人为的)示例,电话号码在某个国家/地区可能是唯一的,但不是国际性的。因此:

// An Aggregate Root
public class Country {

  // Store a lookup structure (userId, phoneNumber) here

  public void addUser(userId, phoneNumber) {
    // check phone uniqueness here
  }

  public void changeUserPhone(userId, phoneNumber) {
    // check phone uniqueness here
  }
}

由于您使用的是CQRS,因此在单独的聚合中的电话号码无关紧要,因为在查询方面,Read Models会将用户及其phoneNumber重新组合在一起。

这也适用于"don't create Aggregate Roots"方法,因为您有创建用户的起点(用户可能是AR),而不仅仅是凭空创建。

答案 1 :(得分:0)

您可以让您的存储库检查电话号码是否存在,如果存在则抛出规则异常,否则保存更改。这里的关键是通过应用程序层注入存储库的实例,并在域层内运行规则。