Martin Fowler 认为贫血域模型是一种反模式。
由于Object Relational Impedence Missmatch ,将持久性模型作为域模型滚动似乎也严重偏离了。为了持久性和规范化,我们倾向于将类分解为非常小的部分,在这些类之上使用方法是愚蠢的。加上持久性很少改变,但业务逻辑改变了一点。
所以我们需要一个建立在持久性模型上的 DomainModel(而不是一模一样)。然后,此领域模型将包含业务逻辑属性和方法。
但是现在这些领域模型仍然在服务背后,为了将它们暴露给外部世界,我们需要将它们转换为 DTO。
我们在这里做了很多映射。
- 领域模型的持久性
- 将域模型转换为 DTO 以在服务之间传递
它并没有就此结束,因为可能需要将 DTO 映射到 ViewModel 中。
所有这些以及重复验证逻辑的问题仍然没有消失,因为客户端需要实时验证。ViewModel 对验证一无所知,因此例如在 SPA 中,您不得不在客户端(通常在 javascript 中)再次重写验证逻辑。
此外,服务本质上是无状态的(面向消息或 RPC),所以我们正在做所有这些映射,在 Persistence 之间,到 OO,然后再回到 Procedural,有什么好处?在大多数 IT 预算中,您如何证明成本的实际价值?
我知道拥有完整的 DDD、聚合根、域模型等是多么“酷”,但你如何证明成本和对开发生产力的影响是合理的?
反模式(或反模式)是一种在社会或商业运营或软件工程中使用的模式,可能常用但在实践中无效和/或适得其反
如果是这样,那么 DDD 和富域模型是否比“精益”域模型更适合上面的反模式定义。对不起,我鄙视加载的词,“贫血”。
通过保持领域模型“精益”,您实际上允许共享它,而不会违反“抽象依赖原则”、“不要重复自己”以及将一个数据载体映射到另一个数据载体的耗时、乏味且容易出错的过程,以及任何相关的单元测试(除非您正在考虑进行不带单元测试的映射并希望获得最好的结果)。