相关疑难解决方法(0)

DDD适合各种应用吗?

我在这里和其他论坛上看到的很多问题都有一个常见的反应,就是"你不需要为此做DDD.它是一个简单的CRUD应用程序,DDD是一种过度工程".

嗯,我是DDD的新手,我觉得DDD中有很多元素具有普遍的吸引力,可以全面使用,无论你的应用程序是否复杂,都需要DDD.例如,应用程序的分层,DDD识别的不同工件等等.可能从基础知识开始,然后承认贫血模型,然后工作/重构尽可能多的纯度.

这种方法听起来不错吗?
或者你会说在每个应用程序的设计中是否有一个基本的选择,无论是否采用DDD方式,是一种"全有或全无"的选择?

更新 (提供更多上下文,以回应下面的休的评论)
  我正在围绕现有的RuleEngine类应用程序构建一个webapp,基本上是CRUD和一些验证,不变量,然后是部署过程.规则创作和语义检查由一段独立的代码完成,我将其作为CRUD的一部分调用,并且我的代码中没有任何语义特定的逻辑.我正在尝试将DDD用于此应用程序,但我发现它可能不够复杂到适合DDD范例.没有为该域定义普遍存在的语言,即除了命名所涉及的实体集之外,该语言还不够专业.我听说我的领域专家在创建,编辑,删除实体方面发言.

domain-driven-design ddd-repositories

7
推荐指数
1
解决办法
590
查看次数

DDD 中的软删除

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

从 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,有没有更干净的方法来实现相同的效果?

domain-driven-design ddd-repositories

0
推荐指数
1
解决办法
1921
查看次数