我们应该在DDD中使用“按功能打包”结构吗?

时间:2019-03-19 16:26:52

标签: architecture domain-driven-design directory-structure

经过研究,我确认在大多数情况下,按功能文件夹的结构要优于按功能文件夹的结构。要获取一些论点,我们可以阅读以下文章,甚至甚至是this answer

Package by features, not layers
Feature folders vs Tech folders
Package by feature, not layer
Package by Layer for Spring Projects Is Obsolete

但是,我发现的所有DDD项目示例都是使用逐层打包制作的,大多数情况下都是这样的结构:

├──应用程序
├──配置
├──域
├──基础设施
──接口

所以我的问题是:为什么DDD社区不遵循按功能打包,即使在大多数情况下它显然更胜一筹?

我们应该在DDD中使用按功能打包吗?如果是这样,该怎么做?

我提到我不是在谈论微服务架构的特殊情况,其中逐层打包显然更多相关。

3 个答案:

答案 0 :(得分:1)

  

为什么DDD社区不按功能打包

我认为您会发现好的项目确实是按功能打包的。

示例中,您可能会发现它没有被遵守。慷慨的解释是,作者试图使识别关注点的分离和依赖箭头的方向更加容易。

慷慨地减少?作者没有注意,还是不了解。

  

我们应该对DDD使用按功能打包吗?如果是这样,该怎么做?

是的,如果您进行DDD,您几乎可以按功能逐个打包。它们是正交的问题。

答案 1 :(得分:1)

我对这个问题的理解和看法如下:

按功能打包是关于垂直切片(根据领域概念来构造源代码),而不是通过水平分层(根据技术概念来构造)。

但是说“代替”并不是完全正确的,因为有时您必须区分这些技术概念。最好先说按要素打包,然后再在每个要素内逐层打包。

在战略DDD中,每个绑定上下文(BC)都是一个垂直切片(整个应用程序,完整的堆栈...以及UI,应用程序,域模型和基础结构层)。

然后,在BC内部,战术DDD促进按业务概念,然后按技术概念(战术模式)打包域模​​型代码。因此,您拥有模块(紧密结合且松散耦合的聚合组),并且在每个聚合内,您都有实体,值对象,工厂,存储库。其他层(UI,应用程序,下文)也可以由模块构成。

因此,作为摘要,DDD确实采用了混合方法:

  • 按业务概念打包不同级别的粒度:BC,模块,聚合。

  • 在BC中按层打包:UI,应用程序,域,基础结构。

PD:沃恩·弗农(Vaughn Vernon)的书“实施DDD”的第9章(模块)对此主题(源代码结构)进行了解释。

答案 2 :(得分:0)

将您的项目分成4层(没有相互依赖性的Java Project模块)。只有基础架构才能访问域和接口。应用程序作为切入点。 Google针对Android Instant Apps提出了相同的结构。

#ifdef DEBUG

这是一个a good article,简明的解释。