正如领域驱动设计中的文献所述,每个实体都由 Id 标识,通常为 long/int 或 GUID 类型。我特别关注了 Vladimir Khorikov Domain Driven Design in practice 的类(class)。 。 当我在现有数据库上进行设计时,如何处理这个问题?
我必须处理公司 ERP 中的表,因此我无法触摸它们、修改或忽略它们,我必须在此持久层之上对我的实体进行建模。 几乎所有表都没有整数标识符,而是各种类型的字段集。 如何将带有 Id 的实体的“整洁”概念与其在没有整数 Id 的数据库中的持久性联系起来?
最佳答案
您正在将实体视为数据库表。这在 DDD 中不一定是真的,因为在代码 Repositories
中也不是这样。
您从域中公开的实体应该遵循 following definition :
An object that is not defined by its attributes, but rather by a thread of continuity and its identity.
就其他互连域而言,您有一个名为“订单”的实体。
在您的数据订单域中,订单可以是多个数据库表的总和(即订单由客户、产品和商店定义)。要为此创建一个唯一的 ID,您可以使用多种技巧。
- 确实使用最顶层表格的 ID(不适用于您的情况)
- 获取复合键值并创建哈希集。维护一个包含三元组和哈希集的本地数据库表,并在检索时使用此映射来访问底层 ERP 数据库,而无需任何明智的操作。
- 加密字符串“value1;value2;value3”中的复合 key 值,并将加密值作为 id 发送。关于检索、解密和访问底层 ERP 数据库
记住:域与内部实现无关,而是与沟通和责任有关。
关于c# - DDD实体的Id与现有数据库建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66259210/