DDD:我们有时应该绕过领域模型吗?

DDD: Should we bypass domain models sometimes?

我在一个项目中工作,我们尝试尽我们所知应用 DDD。我们还使用 CQRS 和洋葱架构。 我们有聚合,我们有存储库。对于每个 post,我们使用一个工厂服务,然后使用聚合存储库保存结果,当然,我们调用存储库而不使用任何工厂。 到目前为止一切顺利!

现在,这对我来说有点可疑,但我很想听听其他意见:对于一些获取,而不是使用领域模型,因为性能问题,我们不想加载例如,整个聚合只是为了获得 5 个字段,所以我们绕过领域模型,我们只为该 CQRS 查询使用一个单独的存储库。这个存储库(我们称之为搜索引擎)return 是一个 DTO(不是像普通存储库那样的域模型 return)。我们绕过整个域,一切都发生在应用层。

这正常吗?这是臭的吗?这看起来是不是我们的领域模型设计不当?这是不好的做法吗?这符合 DDD 和干净的架构吗?

我很想听听你的想法

在现代设计中,在响应安全请求时绕过域模型是很正常的。

从历史上看,当 Evans 描述实现模式时,"database" 只是隐藏在存储库抽象背后的一些实现细节。因此,对数据的访问受到存储库接口所提供内容的限制;这意味着聚合根,或聚合根的集合。

您可以在 Cargo Booking sample 中看到这一点,其中存储库提供聚合根列表,然后该根列表被转换为 DTO 列表。

我将此归因于埃文斯在 Java 大约 2003 年的工作;当时有一堆隐含的约束没有比 "that's what we thought good OO design looked like" 更真实的理由。

公平地说,您希望将读取模型基于写入模型将使用的数据并非完全不合理。写入模型预计会根据业务需求而改变;如果我们希望视图代表模型,那么视图将需要进行相同的更改,并且如果一个直接依赖另一个,则更容易确保。

随着分布式域驱动设计的引入(最终成为命令查询责任分离),我们开始放弃 "aggregates" 支持安全查询的观念。如果你想查询数据,你问一个数据库——这就是数据库 for.

域模型的唯一职责是管理对数据库中存储的信息的更改。