DDD中的软删除

时间:2012-07-25 06:05:52

标签: domain-driven-design ddd-repositories

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

 从DDD范例中解决这个问题,我看到了一些问题: - DDD建议将Repository对象用于所有与持久性相关的东西,其中域层只定义了这样的repo接口(包含store,remove,find等典型方法)和包含该属性的infrastucture层。实际执行。鉴于此,对于我的问题,那么决定是否进行软删除的逻辑属于域层,如何以任何其他任何删除请求的安全性的方式包含域层中的逻辑在实际调用RepoImpl上的删除实际上从底层存储中删除实体之前,层是通过这个逻辑引导的吗?
即使我有一个像void removeEntity(Entity ent)这样的方法的域服务,我必须在我的repo接口上有一个名为void remove(Entity ent)的公共方法的事实也会失败,因为我无法强制执行{{1}在repo上始终调用服务层而不是removeEntity,并且RepoImpl需要有一个remove方法来实现删除实体。

提议的解决方案
==============
我有这个想法,看起来相当做作,让我们说Repo接口有一个提供最终remove的抽象实现,抽象实现可以做这个逻辑来确定它是软删除还是硬删除。如果它是一个软删除它实际上是一个设置了正确标志的实体的更新,所以它调用public void remove(Entity ent)否则它将实体包装在this.store(ent)

DeleteEvent

注意非公共包访问构造函数,此类的对象只能在域层内构造,因此RepoImpl上的另一个remove方法是 public class DeleteEvent<T>{ //parametrized for Entity private T ent; DeleteEvent(T ent){ this.entity = ent; } public T getEntity(){ return this.entity; } } RepoImpl从此封装器/持有者获取实体并实现删除过程。
这虽然看起来可以工作相当古怪/ hacky,有没有更清晰的方法来实现相同的??

1 个答案:

答案 0 :(得分:2)

你的主要问题是这里缺乏无处不在的语言。软删除和硬删除不是域术语,而是技术术语。您需要做的第一件事是在技术性删除操作的用例中重新考虑您的语言。删除意味着什么?我会说你需要取消,撤销,过期,暂停,禁止,阻止,完成等等。根据状态来考虑你的域名模型,而不是CRUD行动。

然后你的问题的答案是:永远不要做硬删除。

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