2

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

客户曾经使用过的电话号码永远不会被任何其他用户使用。因此,我认为该模型必须允许查询电话号码表(因为它与客户是多对一的,因为旧号码已停用并存档)。

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

4

2 回答 2

3

另一种方法是创建一个聚合,明确说明您希望唯一约束在哪个范围内保存。

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

// 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,电话号码位于单独的聚合中并不重要,因为在查询端,读取模型会将用户和他们的电话号码重新组合在一起。

这也适用于“不要创建聚合根”方法,因为您有一个创建用户的起点(用户可能是 AR),而不仅仅是凭空创建它。

于 2015-10-09T10:05:35.880 回答
0

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

于 2015-10-12T06:10:32.223 回答