如何处理富域模型的持久性

我正在重新devise我的NodeJS应用程序,因为我想使用Rich Domain Model概念。 目前我正在使用贫血域模型,这不是扩展好..我只是看到'如果'无处不在大声笑。

我已经阅读了一堆博客post和DDD相关的博客,但有一些我根本无法理解…我们如何正确处理持久性。

首先,我想描述我已经定义的图层和目的:

持久性模型

  • 定义表模型。 定义表名,列,键和关系
  • 我使用Sequelize作为ORM,所以用Sequelize定义的模型被认为是我的持久性模型

领域模型

  • 实体和行为。 与作为业务域一部分创build的抽象相对应的对象
  • 我已经创build了几个类,这里​​最好的事情是,我可以从层次结构中获益,解决所有问题(没有ifs的负载)。

数据访问对象(DAO)

  • 负责数据pipe理,并将持久性模型条目转换为域模型的实体。 所有与持久相关的活动都属于这一层
  • 就我而言,DAO在持久性模型上创build的Sequelize模型上工作,但是,我正在序列化基于数据库交互的不同对象的数据库交互的属性。 例如:如果我有一个名为'UserType'的列包含两个值[ADMIN,USER]的表,当我select这个表上的条目时,我会根据用户types序列化返回,所以一个用户types: ADMIN将是AdminUser类的一个实例,其中types为USER的用户将只是一个DefaultUser …

服务层

  • 负责所有通用业务逻辑,例如不属于任何域对象行为的实用程序和其他服务

客户端层

  • 任何使用对象的消费者类,负责触发持久性

现在,当我实现客户端层时,混乱开始了…

比方说,我正在实施一个新的REST API:

POST: .../api/CreateOrderForUser/ { items: [{ productId: 1, quantity: 4 },{ productId: 3, quantity: 2 }] } 

在我的处理函数,我会有这样的事情:

 function(oReq){ var oRequestBody = oReq.body; var oCurrentUser = oReq.user; //This is already a Domain Object var aOrderItems = oRequestBody.map(function(mOrderData){ return new Order(mOrderData); //Constructor sets the properties internally }); var oOrder = new Order({ items: aOrderItems }); oCurrentUser.addOrder(oOrder); // Okay... So far so good... But how do I persist whatever // happened above? Should I call each DAO for each entity // created? Like, first create the Order, then create the // Items, then update the User? } 

好吧…所以我发现使其工作的一种方式实际上是合并持久性模型和领域模型,这意味着oCurrentUser.addOrder(…)将执行所需的业务逻辑,并将调用OrderDAO来坚持订单随着项目在最后。 关于这一点的坏处是,现在addOrder也必须处理事务,因为我不想添加没有项目的订单,或更新没有订单的用户。

那么,我在这里错过了什么?