领域模型和持久化模型(数据模型)

  在DDD里,领域模型和持久化模型是否是同一个,两个之间如何作用。今天,群友推荐了一篇文章,看了很有启发,由于是英文文档,这里做了一下翻译,也就次展开一些讨论。

原文:http://sc.qq.com/fx/u?r=rBw2YdA

  在stackoverflow上关于DDD的问题,90%的情况下你会看到这种情形,问题描述是"我有一个领域对象",但是贴出的代码却展示了一个EF(entity framework)或者NH(NHibernate)对象。

  错!这样是错误的!

  我已经说过并反复提出,领域模型构建的是针对实际场景的问题以及解决方案的对象,它构建的是对象行为。而数据模型构建的是数据本身以及其存储,即数据的存储结构。所以,它们有不同的目的。领域是应用程序的基石,所有的程序模块搭建都是围绕领域模型而来。所以领域模型的构建不应该依赖于其他任何部分(被基础框架或者其他绑架),尤其是不应该依赖于具体的持久化应用,例如EF和NH。当你设计领域实体时,它们并不知道持久化的存在。

  在设计数据持久层时,需要考虑为领域模型提供服务以及依赖于领域层。所以持久层的设计需要知道领域模型的所有,而不是相反。你怀着存储的目的设计持久化对象,并让它们符合ORM的规范(例如让所有属性用修饰符virtual标识)。这样你会根据不同的目的与应用去创建领域实体以及持久化实体。

  虽然有时你看到的领域模型与持久化模型相似甚至有些事完全相同(当领域非常简单时),但这纯粹是一个巧合。当你在一个仓储里创建模型或者用到了ORM,那你是在创建持久化模型而不是领域模型。Eric Evans推荐护士任何与DB相关的因素,通过领域模型(Domain)去构造应用程序,其中一个理由就是:领域不应该被基础设施细节所绑架,因为大部分人通用的做法是以数据库的设计作为中心。但是你并是为了领域业务而不是数据库而构造应该,数据库只是持久化的实现细节。

  总之,跟着我重复:领域模型和持久化模型并不一样。两者有不同的责任并处于不同的层。

 

posted @ 2016-12-19 19:40  danqiubore  阅读(4809)  评论(0)    收藏  举报