小编Fra*_*kra的帖子

如何使用Rich Domain Model处理持久性

我正在重新设计NodeJS应用程序,因为我想使用Rich Domain Model概念。目前,我正在使用Anemic域模型,并且扩展性不好,我到处都看到“ ifs”。

我已经阅读了许多博客文章和与DDD相关的博客,但是有些事情我根本无法理解...我们如何正确处理持久性。

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

持续性模型

  • 定义表模型。定义表名称,列,键和关系
  • 我将Sequelize用作ORM,因此将用Sequelize定义的模型视为我的持久性模型

领域模型

  • 实体和行为。对应于作为业务域一部分创建的抽象的对象
  • 我已经创建了几个类,并且这里最好的是,我可以受益于层次结构来解决所有问题(无需加载ifs yay)。

数据访问对象(DAO)

  • 负责数据管理以及将持久性模型的条目转换为域模型的实体。所有与持久性相关的活动都属于此层
  • 在我的情况下,DAO在基于持久性模型创建的Sequelize模型的基础上工作,但是,我正在根据其属性在不同对象中序列化数据库交互返回的记录。例如:如果我有一个表,该表的列名为“ UserType”,其中包含两个值[ADMIN,USER],则当我在该表上选择条目时,我会根据用户类型对返回值进行序列化,因此,一个用户类型为: ADMIN将是AdminUser类的实例,其中类型为USER的User将只是DefaultUser ...

服务层

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

客户层

  • 任何与对象玩耍并负责触发持久性的Consumer类

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

假设我正在实现一个新的REST API:

POST: .../api/CreateOrderForUser/
{
  items: [{
    productId: 1,
    quantity: 4
  },{
    productId: 3,
    quantity: 2
  }]
}
Run Code Online (Sandbox Code Playgroud)

在我的处理程序函数上,我将有类似以下内容:

function(oReq){
  var oRequestBody = oReq.body;
  var oCurrentUser = oReq.user; //This is already a Domain Object
  var aOrderItems = oRequestBody.map(function(mOrderData){
    return new OrderItem(mOrderData); //Constructor sets the properties internally
  });
  var oOrder = new Order({
    items: aOrderItems
  });

  oCurrentUser.addOrder(oOrder); …
Run Code Online (Sandbox Code Playgroud)

architecture domain-driven-design node.js sequelize.js rich-domain-model

5
推荐指数
1
解决办法
624
查看次数