数据库实体关系上的域与 DTO
Domain vs DTO on database entity relations
我在一个数据库上有三个表,一个旧的很好的查询在使用 RowMapper 后为 DTO 对象上的用例连接了有趣的列。经典 Java 方法。
但我想知道,如何将其转换为 DDD 实现?我如何使用实体来解决问题,而无需 3 个单独的查询来创建具有其字段的模型,然后创建一个 DTO 仅用于创建具有所需列的对象?
我错过了什么?或者应该比已经实施的方式更好?
您无法将该模型转换为 DDD。
DDD 是关于在单独的层中创建业务模型:领域层。该层的目的是验证任何 state-changing 操作不违反您的业务规则。如何为域实体建模必须由您正在处理的用例驱动,而不是数据的存储方式:域层被称为 持久性不可知论者 。数据存储在一个或多个存储、RDBMS、nosql、文件等中并不重要……这就是基础设施层的目的。
域对象由称为 存储库 的 class 读取。存储库的行为类似于域对象的内存集合,但实际上 re-hydrates 来自持久性存储的对象。它作为持久性模型和域模型之间的中介。由于模型可能不同,存储库可以展平关系、连接来自不同来源的数据,并在需要时忽略某些列。
查询状态时,根本不需要使用领域层。该层的目的是验证 state-changing 操作,business-wise,但这在查询状态时是不必要的。在这种情况下,您可以实施 classes,称为 mediators,它将查询您的数据库并生成表示层 DTO。与存储库一样,中介器是持久性模型和表示模型之间的适配器。它可以连接来自多个持久性存储的数据、展平关系以及忽略列。
是否使用 ORM 来访问数据库是您的基础架构层的实现细节。它与领域建模无关,领域建模与您的用例和业务规则验证有关。
我在一个数据库上有三个表,一个旧的很好的查询在使用 RowMapper 后为 DTO 对象上的用例连接了有趣的列。经典 Java 方法。
但我想知道,如何将其转换为 DDD 实现?我如何使用实体来解决问题,而无需 3 个单独的查询来创建具有其字段的模型,然后创建一个 DTO 仅用于创建具有所需列的对象?
我错过了什么?或者应该比已经实施的方式更好?
您无法将该模型转换为 DDD。
DDD 是关于在单独的层中创建业务模型:领域层。该层的目的是验证任何 state-changing 操作不违反您的业务规则。如何为域实体建模必须由您正在处理的用例驱动,而不是数据的存储方式:域层被称为 持久性不可知论者 。数据存储在一个或多个存储、RDBMS、nosql、文件等中并不重要……这就是基础设施层的目的。
域对象由称为 存储库 的 class 读取。存储库的行为类似于域对象的内存集合,但实际上 re-hydrates 来自持久性存储的对象。它作为持久性模型和域模型之间的中介。由于模型可能不同,存储库可以展平关系、连接来自不同来源的数据,并在需要时忽略某些列。
查询状态时,根本不需要使用领域层。该层的目的是验证 state-changing 操作,business-wise,但这在查询状态时是不必要的。在这种情况下,您可以实施 classes,称为 mediators,它将查询您的数据库并生成表示层 DTO。与存储库一样,中介器是持久性模型和表示模型之间的适配器。它可以连接来自多个持久性存储的数据、展平关系以及忽略列。
是否使用 ORM 来访问数据库是您的基础架构层的实现细节。它与领域建模无关,领域建模与您的用例和业务规则验证有关。