我正在重新设计我的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还必须处理事务,因为我不想在没有项目的情况下添加订单,或者在没有订单的情况下更新用户 .
那么,我在这里失踪了什么?