当前位置: 首页 > 知识库问答 >
问题:

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

牛凌
2023-03-14

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

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

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

共有2个答案

拓拔欣嘉
2023-03-14

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

禹昆
2023-03-14

另一种方法是创建一个聚合,使其明确表示唯一约束要包含的范围。

举个(人为的)例子,一个电话号码在一个国家可能是唯一的,但在国际上可能不是唯一的。因此:

// 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
  }
}

因为您使用的是CQR,所以电话号码在单独的聚合中并不重要,因为在查询端,Read模型会将用户和他们的电话号码重新组合在一起。

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

 类似资料:
  • 问题内容: 我正在使用jQuery,我只是想知道,ID在整个页面中是否必须始终唯一?我知道,您可以根据需要将课程重复多次,ID呢? 问题答案: 是的,它必须是唯一的。 id属性指定其元素的唯一标识符(ID)。该值在元素的主子树中的所有ID中必须是唯一的,并且必须包含至少一个字符。该值不得包含任何空格字符。

  • getSystemInfoSync() 返回值 systemInfo的属性 名称 类型 备注 gameVersion string 游戏版本号 isMaster number 是否房主,1房主,0参加者 roomId number 房间号 gameId number 游戏id osVersion string 系统版本 10.3 networkType number 网络类型 1 电信 ,2 联通

  • 系统信息 显示PSP™主机的MAC地址、系统软件版本和昵称。

  • 可确认系统软件之版本、MAC地址,以及PS Vita专用存储卡的空余容量等。

  • jd.getSystemInfo(OBJECT) 获取系统信息。 OBJECT 参数说明: 参数 类型 必填 说明 success Function 是 接口调用成功的回调 fail Function 否 接口调用失败的回调函数 complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行) success 回调参数说明: 参数 说明 brand 手机品牌 model 手

  • uptime 联机信息-时间,显示如下 11:27pm up 9 days, 7:12,3 user, load average: 0.07, 0.12, 0.14 当前系统时间 系统运行时间 当前在线用户数 系统负荷:1分钟前、5分钟前、15分钟前 w 联机信息-已登录用户,显示如下 01:04:10 up 1:34, 2 users, load average: 0