Domain driven design 领域驱动设计(DDD)陷阱

Domain driven design 领域驱动设计(DDD)陷阱,domain-driven-design,Domain Driven Design,我是DDD的新手,希望了解您可能想分享的任何陷阱。稍后我将对其进行总结,让更多的新手阅读:) 谢谢 迄今为止的总结: 您的实体主要只承载数据,不包含业务逻辑 没有充分使用有界上下文 过分关注模式 关于这个主题也有一个很好的演示(视频)。最大的陷阱之一是,您最终会遇到一个所谓的问题,即您的实体主要只承载数据,不包含业务逻辑。当您在现有关系数据模型的基础上构建域模型,并将数据库中的每个表作为域模型中的实体时,通常会出现这种情况 当心 领域驱动设计的陷阱之一是在模型中引入模糊性。如文章所述: 模棱

我是DDD的新手,希望了解您可能想分享的任何陷阱。稍后我将对其进行总结,让更多的新手阅读:)

谢谢

迄今为止的总结:

  • 您的实体主要只承载数据,不包含业务逻辑
  • 没有充分使用有界上下文
  • 过分关注模式

关于这个主题也有一个很好的演示(视频)。

最大的陷阱之一是,您最终会遇到一个所谓的问题,即您的实体主要只承载数据,不包含业务逻辑。当您在现有关系数据模型的基础上构建域模型,并将数据库中的每个表作为域模型中的实体时,通常会出现这种情况

当心

领域驱动设计的陷阱之一是在模型中引入模糊性。如文章所述:

模棱两可是我们国家的超级恶棍 泛在语言

当两个不同的概念共享同一名称,或者同一概念可能有不同的用途时,可能会发生这种情况。可能有必要

在中公开域结构 上下文中有界上下文的术语 地图

如果一个模型使用了太多不同的方式,或者有太多的责任,这可能表明它应该被划分。

使用得不够。这本书就在蓝色大书的后面,但埃里克·埃文斯(Eric Evans)公开表示,他相信有界语境和无处不在的语言是最重要的概念

同样,人们往往过于关注模式。那些不是DDD的肉

此外,如果你没有很多领域专家的访问权限,那么你可能没有做DDD,充其量你是DDDish


更具体地说,如果你最终建立了多对多的关系,那么你可能设计了一些错误的东西,需要重新评估你的聚合根/上下文

可能是最重要的一个:不要探索域模型的核心、基本原则及其在泛在语言中的表示。有了太多的技术选项,你的头脑很容易就充满了ORMs、MVC框架、ajax、sql和nosql。。。如此之多,以至于您试图解决的实际问题几乎没有空间了

这就是DDD的关键信息:不要。相反,首先明确关注问题空间。构建一个去除了体系结构混乱的领域模型,以捕获、公开和传达该领域

哦,还有一个问题:认为你需要域服务来完成你在域模型中所能做的一切。不可以。您应该首先尝试将域逻辑与它所属的实体/值类型放在一起。只有在发现不属于E/V的功能时,才应该创建域服务。否则,您最终会在别处突出显示贫乏的域模型

hth.

你可能会喜欢格雷格·杨讲述DDD失败的原因

简言之:

  • 缺乏意图
  • 贫血域模型
  • DDD-Lite
  • 缺乏孤立
  • 什么
  • 不精
  • 代理域专家(业务分析师)

只是补充了别人已经说过的话; 我个人的经验是,人们通常会以一个贫血模型和一个模型而不是多个特定于环境的模型告终

另一个问题是,许多人更关注DDD中使用的基础设施和模式。
仅仅因为你有实体和存储,并且正在使用(n)Hibernate,这并不意味着你在做DDD。

这不是我个人对这个主题的经验,但它在DDD书籍中被提到过几次,我最近一直在想:当你真的需要身份时使用实体,在其他情况下,使用值对象。也就是说,实体模式通常是任何模型名词的默认选择,而这不是它应该的方式。

我同意这一点。是我第一次爱上新人,我不同意这一点。DDD不是一种实现理念,而是一种实现理念,其中的可能性是无穷无尽的。所以你不建议使用函数式编程?你可能应该把这个问题放到社区wiki上。我发现对域服务的需求是尚未被认可的聚合root.Wow的一个非常真实的想法。这正在融化我的思想。请看一看。您的第二条规则不是DDD规则,它是一个简单的OO概念。抽象级别错误的代码。但是,不要将值对象与EF一起使用。别这样。(Jimmy Bogard有一个EF DDD记分卡,链接当前已断开)仅仅因为您有实体和存储并且正在使用(n)Hubernate,并不意味着您正在进行DDD。杰出的