red*_*edi 0 domain-driven-design ddd-repositories
我有一个场景,当用户请求删除时,可能会根据某种逻辑将给定实体标记为软删除或硬删除。
从 DDD 范式解决这个问题,我看到了一些问题:- DDD 建议对所有与持久性相关的东西使用 Repository 对象,其中域层仅定义这样的存储库接口(包含存储、删除、查找等典型方法)和包含存储、删除、查找等典型方法的基础设施层实际执行。考虑到,对于我这里的问题,决定是否进行软删除的逻辑属于域层,如何才能以这样的方式包含域层中的逻辑,即任何其他删除请求的安全性在实际调用 RepoImpl 上的删除操作(实际上从底层存储中删除实体)之前,层会通过此逻辑进行引导。
即使我有一个具有类似方法的域服务void removeEntity(Entity ent),但事实上我必须在我的存储库接口上有一个名为 的公共方法,这void remove(Entity ent)违背了目的,因为我无法强制removeEntity执行服务层的方法总是被调用,而不是remove在存储库上调用RepoImpl 需要有一个删除方法来实现实体的删除。
建议的解决方案
==============
我有一个看起来相当做作的想法,假设 Repo 接口有一个抽象实现,它提供了一个 Final 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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,非公共的包访问构造函数,此类的对象只能从域层内构造,因此 RepoImpl 上的另一个删除方法是void removeFromStore(DeleteEvent evt) RepoImpl 从该密封器/持有者获取实体并实现删除过程。
虽然看起来可以工作但相当古怪/hacky,有没有更干净的方法来实现相同的效果?
您的主要问题是这里缺乏普遍的语言。软删除和硬删除不是领域术语,而是技术术语。您需要做的第一件事是重新考虑围绕技术删除操作的用例中的语言。删除到底是什么意思?我想说你需要取消、撤销、过期、暂停、禁止、阻止、完成等。从你将域模型置于的状态而不是 CRUD 操作来考虑。
那么你的问题的答案是:永远不要进行硬删除。
更多阅读:http://www.udidahan.com/2009/09/01/dont-delete-just-dont/
| 归档时间: |
|
| 查看次数: |
1921 次 |
| 最近记录: |