我正在重新设计我的NodeJS应用程序,因为我想使用Rich Domain Model概念 . 目前我正在使用贫血领域模型,这不是很好的扩展...我只是看到'ifs'到处都是lol .

我已经阅读了一些博客文章和DDD相关的博客,但有些东西我根本无法理解......我们如何正确处理持久性 .

首先,我想描述我定义的图层及其用途:

持久性模型

  • 定义表模型 . 定义表名,列,键和关系

  • 我使用Sequelize作为ORM,因此使用Sequelize定义的模型被认为是我的持久模型

领域模型

  • 实体和行为 . 与作为业务域的一部分创建的抽象相对应的对象

  • 我创建了几个类,这里最好的是我可以从层次结构中受益来解决所有问题(没有ifs yay的负载) .

数据访问对象(DAO)

  • 负责数据管理并将持久性模型的条目转换为域模型的实体 . 所有与持久性相关的活动都属于该层

  • 在我的情况下,DAO在持久性模型上创建的Sequelize模型之上工作,但是,我根据属性将不同对象中的数据库交互返回的记录序列化 . 例如:如果我有一个名为'UserType'的列,其中包含两个值[ADMIN,USER],当我在此表上选择条目时,我会根据用户类型序列化返回,因此具有类型:ADMIN的用户将是AdminUser类的一个实例,其中类型为USER的用户只是一个DefaultUser ...

服务层

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

客户层

  • 任何使用Objects的Consumer类,负责触发Persistence

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

假设我正在实现一个新的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还必须处理事务,因为我不想在没有项目的情况下添加订单,或者在没有订单的情况下更新用户 .

那么,我在这里失踪了什么?