当前位置 : 主页 > 手机开发 > 其它 >

域驱动设计 – 在DDD中执行实体删除

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在学习DDD并且有这个基本问题: 似乎工厂,丰富的域模型,存储库的创建,读取,更新(CRUD)都得到了解决,但删除呢?删除实体可能会有一些业务逻辑,你在哪里处理它? RepositoryImpl(属于
我正在学习DDD并且有这个基本问题:

似乎工厂,丰富的域模型,存储库的创建,读取,更新(CRUD)都得到了解决,但删除呢?删除实体可能会有一些业务逻辑,你在哪里处理它? RepositoryImpl(属于基础结构)层不应该打扰自己检查那些不变量,它的工作是从底层数据存储中删除给定的实体.这似乎与工厂的意图截然相反,但DDD没有类似“杀死”工厂的删除.

假设有一个用户可以删除的Order实体,但是直到它处于“Fulfilled”状态,因此请求删除repo.delete(ent)的客户端应该获得Exception.类似地,可能存在这样的情况:当客户端请求删除时,它导致更新(可以是状态改变或设置软删除标志).

应该在哪里处理这样的场景entity.delete()(它有意义吗?)还是在名为delete的应用程序或域服务中.我担心的是只要Repository接口具有名为delete的方法,任何客户端都可以绕过服务方法并直接调用repo方法.

只是为了添加一个上下文,我将如何构建我的层是通过Java包,并使用包可见性作为工具来禁止破坏层之间的交互.

据我所知,DDD中没有具体的删除指南(“删除”是一个非常通用且面向数据的术语).它被称为“生命的终结”,它是存储库的责任.大多数情况下,生命结束并不简单,并且与某些业务规则相关联,可能是状态更改等.通常,域对象根本不会被删除,它们只是转换为“已存档”状态.我强烈推荐Udi Dahan阅读 this article.

为了强制执行与对象生命周期结束相关的不变量,您可以像这样构造代码:

class Order{
  ...
  bool CanBeArchived(){
    ...
  }
  ...
}

interface OrderArchiver {
  // throws InvalidOperationException if order can not be archived
  void Archive(Order order);
}

class NHibernateOrderArchiver implements OrderArchiver {      
  void Archive(Order order){
    if(!order.CanBeArchived()){
      throw new InvalidOperationException("Order can not be archived.");
    }
    ...
  }
}

如果实现需要访问与Order关联的其他域对象,则’CanBeArchived’方法也可以是’OrderArchiver’接口的一部分.

网友评论