DDD - 域模型中的CreatedBy/CreatedOn?

Dav*_*vid 4 design-patterns domain-driven-design dto

当数据库编写通过标准的应用程序为每个表,我有以下特性:CreatedOn,CreatedBy,ModifiedOn,ModifiedBy,Archived.

但是试图跟踪DDD我在质疑这些属性是否真的是域的一部分,应该包含在域对象中.如果我要从域中排除这些"元数据"属性但仍然希望它们在我的数据库中,那么如果我打算使用ORM,我需要实现某种DTO层.

所以,领域模型映射到DTO的CreatedOn,ModifiedOn等设置,然后推到数据库中.

所以我想我的问题是:

  1. 我是否只将这些属性作为我的域模型的一部分?
  2. 我是否删除它们但是不得不映射DTO的头痛?
  3. 是否有一种替代方案可以消除诸如实施某种形式的审计日志之类的问题?

Den*_*aub 5

在进行域驱动设计时,您的实体通常与数据库的结构无关.

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

将数据库驱动的方面强制进入您的域模型与DDD的全部内容相矛盾.

所以是的,我建议将ORM的表对象(无论如何都是纯数据)映射到聚合中.这就是Repository模式发挥作用的地方.它将通过转换基础数据来提供域的对象.

如果创建/修改日期和用户等元数据本身不是业务域的一部分(即系统范围的日志记录要求),则可以在转换回要保存的表对象时注入给定用户和日期/时间.

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

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

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

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

 ----------------------------
| Database                   | (this is where the data lives)
 ----------------------------
Run Code Online (Sandbox Code Playgroud)