按标准为数据库中的每个表编写应用程序时,我具有以下属性:CreatedOnCreatedByModifiedOnModifiedByArchived

但是尝试遵循DDD,我在质疑这些属性是否确实是域的一部分,是否应该包含在域对象中。如果我要从域中排除这些“元数据”属性,但仍希望在我的数据库中使用它们,那么如果要使用ORM,则需要实现某种DTO层。

因此,将域模型映射到DTO,设置CreatedOnModifiedOn等,然后将其推送到数据库。

所以我想我的问题是:


我是否仅将这些属性作为域模型的一部分使用?
我是否可以删除它们,但不得不映射DTO?
是否有替代方法可以消除两个问题,例如实施某种形式的审核日志?

最佳答案

在进行域驱动设计时,您的实体通常与数据库的结构关系不大。

您很快就会到达一个点,无论如何,您需要在ORM的表对象和域的聚合之间进行映射。

将数据库驱动的方面强制进入您的域模型与DDD的含义矛盾。

因此,是的,我建议将ORM的表对象(无论如何都是纯数据)映射到您的聚合中。这就是存储库模式起作用的地方。它将通过转换基础数据来提供域的对象。

如果诸如创建/修改日期和用户之类的元数据不是业务领域的固有组成部分(即系统范围的日志记录要求),则在转换回表对象进行保存时,可以注入给定的用户和日期/时间。

分层体系结构可能如下所示:

 ----------------------------
| Domain                     | (Aggregates)
 ----------------------------

 ----------------------------
| Repositories               | (transforms table-objects into Aggregates)
 ----------------------------

 ----------------------------
| OR-Mapper                  | (loads records from DB into table-objects)
 ----------------------------

 ----------------------------
| Database                   | (this is where the data lives)
 ----------------------------

08-06 19:19