Domain driven design DDD中的软删除

Domain driven design DDD中的软删除,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,我有一个场景,当用户请求删除时,根据某种逻辑,给定的实体可能被标记为软删除或硬删除 从DDD范例来看这个问题,我看到了一些问题:-DDD建议对所有持久性相关的东西使用Repository对象,其中域层只定义这样的repo接口(包含典型的方法,如存储、删除、查找)和包含实际实现的基础结构层。鉴于此,对于我这里的问题,决定是否进行软删除的逻辑属于域层,如何能够在域层中包含逻辑,从而确保在实际调用RepoImpl上的delete之前,任何其他层的任何删除请求都通过该逻辑传递,从而实际从底层存储中删除

我有一个场景,当用户请求删除时,根据某种逻辑,给定的实体可能被标记为软删除或硬删除

从DDD范例来看这个问题,我看到了一些问题:-DDD建议对所有持久性相关的东西使用Repository对象,其中域层只定义这样的repo接口(包含典型的方法,如存储、删除、查找)和包含实际实现的基础结构层。鉴于此,对于我这里的问题,决定是否进行软删除的逻辑属于域层,如何能够在域层中包含逻辑,从而确保在实际调用RepoImpl上的delete之前,任何其他层的任何删除请求都通过该逻辑传递,从而实际从底层存储中删除实体???。

即使我有一个域服务有一个类似于
void removentity(Entity ent)
的方法,事实上我必须在我的repo接口上有一个名为
void remove(Entity ent)的公共方法
无法实现此目的,因为我无法强制始终调用服务层的
removeEntity
,而不是在repo上调用
remove
,并且RepoImpl需要一个remove方法来实现实体的移除。

建议的解决方案
==============
我有一个看起来相当做作的想法,比如说回购接口有一个抽象实现,它提供了一个最终的
公共无效删除(Entity ent)
,抽象实现可以执行这个逻辑来确定它是软删除还是硬删除。如果它是一个软删除,它实际上是一个设置了正确标志的实体更新,因此它调用
this.store(ent)
否则它将实体包装在
DeleteEvent
类中

 public class DeleteEvent<T>{
   //parametrized for Entity
  private T ent;
   DeleteEvent(T ent){
     this.entity = ent;   
}

 public T getEntity(){
   return this.entity; 
}
}
公共类删除事件{
//实体参数化
私人诊所;
删除事件(T ent){
这个实体=ent;
}
公共T getEntity(){
返回该实体;
}
}
请注意,此类的非公共包访问构造函数对象只能从域层内构造,因此RepoImpl上的另一个删除方法是
void removeFromStore(DeleteEvent evt)
RepoImpl从该密封器/保持器获取实体并执行删除过程。

这虽然看起来像是可以工作的,但有没有更干净的方法来达到同样的效果呢?

你的主要问题是这里缺少普遍存在的语言。软删除和硬删除不是领域术语,而是技术术语。您需要做的第一件事是围绕技术删除操作重新考虑用例中的语言。删除的确切含义是什么?我想说的是,你需要一个取消、撤销、过期、暂停、禁止、阻止、完成等操作。考虑你将域模型置于的状态,而不是CRUD操作

那么你的问题的答案是:永远不要硬删除


更多阅读:

你的主要问题是这里缺少无处不在的语言。软删除和硬删除不是领域术语,而是技术术语。您需要做的第一件事是围绕技术删除操作重新考虑用例中的语言。删除的确切含义是什么?我想说的是,你需要一个取消、撤销、过期、暂停、禁止、阻止、完成等操作。考虑你将域模型置于的状态,而不是CRUD操作

那么你的问题的答案是:永远不要硬删除


更多阅读:

DDD认识到删除的概念,不是吗??所以,当存储库接口有一个名为
voidremove(entityent ent)
的方法时,执行者应该假设什么??既然你提到了,如何将用户CRUD操作映射到域操作??显然,用户所知道的delete在这里不是delete(在某些情况下)。在这种情况下,无处不在的语言不会扩展到用户,是吗?我会说remove方法应该设置Deleted=true或类似的东西。如果您的用户只执行CRUD操作,您真的需要DDD还是过度设计您的项目?DDD认识到删除的概念,不是吗??所以,当存储库接口有一个名为
voidremove(entityent ent)
的方法时,执行者应该假设什么??既然你提到了,如何将用户CRUD操作映射到域操作??显然,用户所知道的delete在这里不是delete(在某些情况下)。在这种情况下,无处不在的语言不会扩展到用户,是吗?我会说remove方法应该设置Deleted=true或类似的东西。如果用户只执行CRUD操作,那么您真的需要DDD还是过度设计您的项目?