Domain driven design 作为域标识的外部id
我们的应用程序向与我们合作的第三方发送/接收大量数据。Domain driven design 作为域标识的外部id,domain-driven-design,Domain Driven Design,我们的应用程序向与我们合作的第三方发送/接收大量数据。 我们的域模型主要由这些数据填充 我们面临的“问题”是确定一个“好”候选人作为聚合的域标识 我们似乎有3种选择: 生成域标识(UUID或DB序列…) 使用外部ID作为域标识,它与来自外部源的所有数据一起提供 使用内部域标识和外部标识作为单独的标识“可能”用于检索操作;内部id始终为前导 关于外部ID: 100%保证ID不会更改 ID始终由外部源管理 我们系统中的其他域可能使用外部id进行检索操作 特别是上面的最后一点让我们确信,外部id不
我们的域模型主要由这些数据填充 我们面临的“问题”是确定一个“好”候选人作为聚合的域标识 我们似乎有3种选择:
UUID
或DB序列
…)李>
- 100%保证ID不会更改
- ID始终由外部源管理
- 我们系统中的其他域可能使用外部id进行检索操作
实际上,外部来源是我们活跃于汽车行业的客户。
我们的应用程序使用客户的主数据来完成一些“事情”。我们有几个有界上下文(BC),如“客户管理”、“调查”、“约会”, “维护”等
我们的客户向我们发送“任务”,描述需要完成的事情。 “某物”可能是:
- '让客户X完成调查Y'
- '为客户X安排/取消约会'
- '客户Y的X车计划在XYZ位置进行维护'
但是,我们的客户希望在与任务相关的每个操作之后都有一些消息。因此,我们始终需要使用“任务id” 总结一下:
- 任务具有任务id
- 任务可能与多个BC相关
- 每个BC向客户端发送一些带有相关任务id的“结果消息”
- 任务ID由域事件分发
- 我们使每个(内部)持久化任务保持最新
希望我对外部id(=任务id)的使用和我们不同的BCs已经足够清楚了。我的直觉是管理您自己的身份,而不是依赖第三方服务,所以上面的选项3。但是没有上下文很难说。什么是第三方系统?你的域名是什么 你会切换第三方服务吗 您说域的其他部分可能使用外部id进行查询-他们在查询什么?您的内部系统还是第三方服务 [更新]
根据新的信息,它听起来像一个correlationId。我会将其与其他与聚合相关的信息一起存储 一般来说,我会否决使用DB序列号作为标识符;域模型应该独立于持久性的选择;域模型将标识符写入数据库,而不是以相反的方式写入(如果DB希望出于自身目的跟踪序列号,则可以) 我不愿意使用外部标识符,尽管它在某些情况下是有意义的。一个给定的实体,如“客户”可能在许多不同的有界上下文中具有表示形式——对所有这些实体使用相同的标识符可能是有意义的 我的默认设置是:我将使用外部ID作为种子的一部分,从而实现从外部到内部的简单映射