【问题标题】:soft delete in DDDDDD中的软删除
【发布时间】:2012-07-25 06:05:52
【问题描述】:

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

从 DDD 范式处理这个问题,我看到了一些问题:- DDD 建议将 Repository 对象用于所有与持久性相关的东西,其中域层只定义了这样的 repo 接口(包含典型的方法,如存储、删除、查找)和包含实际执行。鉴于此,对于我的问题,决定是否进行软删除的逻辑属于域层,如何在域层中包含逻辑,以保证任何其他删除请求的安全性在实际调用 RepoImpl 上的删除点之前,层通过此逻辑进行引导,该删除点实际上从底层存储中删除了实体 ??。

即使我有一个域服务具有像 void removeEntity(Entity ent) 这样的方法,我必须在我的 repo 接口上有一个名为 void remove(Entity ent) 的公共方法这一事实违背了目的,因为我无法强制服务层的 removeEntity 是在 repo 上总是被调用而不是 remove 和 RepoImpl 需要有一个 remove 方法来实现实体的删除。

建议的解决方案
==============
我有这个看起来相当做作的想法,假设 Repo 接口有一个抽象实现,它提供了一个最终的 public void 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; 
}
}

注意非公共的,包访问构造函数,这个类的对象只能在领域层内构造,所以RepoImpl上的另一个remove方法是void removeFromStore(DeleteEvent evt)RepoImpl从这个sealer/holder中获取实体并实现removal过程。
虽然看起来 can work 相当古怪/hacky,但有没有更清洁的方法来实现同样的效果??

【问题讨论】:

    标签: domain-driven-design ddd-repositories


    【解决方案1】:

    您的主要问题是这里缺乏通用语言。软删除和硬删除不是领域术语,而是技术术语。您需要做的第一件事是在技术删除操作的用例中重新考虑您的语言。删除到底是什么意思?我会说你需要一个 Cancel、Revoke、Expire、Suspend、Ban、Block、Finish 等。从 state 的角度来考虑你的领域模型,而不是 CRUD 操作。

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

    更多阅读:http://www.udidahan.com/2009/09/01/dont-delete-just-dont/

    【讨论】:

    • DDD 承认删除的概念不是吗??所以当 Repository 接口有一个名为void remove(Entity ent) 的方法时,实现者应该假设什么?既然你提到它,如何将用户 CRUD 操作映射到域操作?所以显然用户所知道的删除不是在这里删除(在某些情况下)。在那种情况下,无处不在的语言不会扩展到用户,是吗??
    • 我想说 remove 方法应该设置 Deleted = true 或类似的东西。
    • 如果您的用户只执行 CRUD 操作,您真的需要 DDD 还是只是过度设计您的项目?
    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 2019-02-21
    • 2011-12-26
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多