按标准为数据库中的每个表编写应用程序时,我具有以下属性:CreatedOn
,CreatedBy
,ModifiedOn
,ModifiedBy
,Archived
。
但是尝试遵循DDD,我在质疑这些属性是否确实是域的一部分,是否应该包含在域对象中。如果我要从域中排除这些“元数据”属性,但仍希望在我的数据库中使用它们,那么如果要使用ORM,则需要实现某种DTO层。
因此,将域模型映射到DTO,设置CreatedOn
,ModifiedOn
等,然后将其推送到数据库。
所以我想我的问题是:
我是否仅将这些属性作为域模型的一部分使用?
我是否可以删除它们,但不得不映射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)
----------------------------