洋葱建筑与六角形相比

时间:2018-04-26 09:06:11

标签: architecture software-design onion-architecture hexagonal-architecture

它们之间是否存在差异(洋葱|六角形),根据我的理解它们是相同的,它们关注的是应用程序核心的领域,应该是技术/框架无关的。

如果有的话,它们之间有什么区别?

此外,我认为使用一个优于另一个甚至是针对N层架构没有真正的优势,如果做得不好,只要跟随它们中的任何一个都不会有任何区别

使用一个而不是另一个有什么好处以及为什么要使用它?何时使用?

由于

4 个答案:

答案 0 :(得分:13)

  

如果有的话,它们之间有什么区别?

洋葱:有层,依赖关系始终指向内部,即图层可以使用其中的任何图层。内层是域模型,外层是基础结构,但层间数可能不同。

六边形(它是原始名称“Ports& Adapters”的替代名称):没有图层。您有应用程序,端口和适配器。端口属于应用程序,它们是应用程序的API / SPI。适配器不在应用程序中,每个适配器都依赖于应用程序的端口。

有些人的讨论是,在实现六边形体系结构时,大多数人并没有将每个适配器放在一个工件中,而是将所有适配器整合到一个工件(如infraestructure层)中。而且他们依赖整个应用程序的适配器,而不仅仅是他们使用的端口。事实上,这将是一个洋葱。

实现六边形权限应该将适配器彼此分开,并且每个适配器应仅依赖于它使用/实现的端口(取决于端口是驱动程序还是驱动程序)。

另一个区别是Hexagonal没有说六边形内部的结构(应用程序)。

  

使用其中一个有什么好处?

六边形的好处在于它更模块化,您可以清楚地分离组件,防止它们之间的代码泄漏。另一方面,洋葱在这个意义上更危险,因为您可以直接从UI访问数据库(它们都属于同一层)。

洋葱的好处来自上述。由于六边形有很多工件,如果项目很大,整个项目的构建应该花费很多时间。

  

为什么要使用它?何时使用?

使用它们中的任何一个的关键是你专注于你试图解决的真正问题,而不使用任何技术或框架。该应用程序与技术无关,并且很容易从框架迁移到另一个框架。因此,它们都被称为“干净”的架构。您的应用程序核心没有框架代码,注释等。

所以...为什么要使用它们?

因为您提高了可维护性,可测试性,并且您拥有干净的代码。

何时使用?

我宁愿说什么时候不使用它们。如果您正在开发的应用程序并不复杂,例如它只是一个CRUD,也许它不值得使用它们。

就个人而言,我更喜欢“端口和适配器”。

希望我的出版物有所帮助。

答案 1 :(得分:1)

以前的答案对Onion体系结构做出了根本上不正确的陈述。他们断言“在洋葱中,UI和数据访问是同一层的一部分”。造成混淆的原因可能是认为所有层都与它们上方和下方的所有内容进行了对话。

实际上,洋葱图不能很好地表示洋葱架构。关键要点是,核心域层与任何周围的层无关,而周围的层通常也彼此无关。通常,这意味着用户界面与服务对话,而服务与数据和域层对话。 UI不会直接与其他层进行交互,并且层之间的交互通过使用依赖注入和接口隔离来抽象。

据我所知,没有建议使用数据访问和UI混合的架构模式(有些是Active Record,将业务和数据访问混合在一起)。另外,有些技术会产生避免分层的代码-快速的开发工具通常会这样做,但是这些工具比设计和可维护性更倾向于部署速度。

洋葱,六角形和端口和适配器实际上是同一概念体系结构的所有不同名称。

马克·西曼(Mark Seeman)的精彩文章有助于阐明差异(如果有的话)是边际和语义上的:Layers, Onions, Ports, Adapters: it's all the same

答案 2 :(得分:-1)

分层架构与洋葱相关的架构系列之间存在差异。分层体系结构使用用户界面和数据访问层之间的层次关系。相比之下,洋葱架构将UI和数据访问视为同一层的一部分。

为什么用户界面和数据访问位于同一层?洋葱架构的核心在于具有业务逻辑的域。这是主要关注点。域不高于或低于任何其他层。它是正中心。用户界面,休息端点等是域的辅助,就像数据存储库一样。

ports and adapters architecture(这是六边形体系结构的另一个名称)通过其名称清楚地表明了这一点:有许多端口充当域和外部之间的接口。适配器实现端口,以便端口可以与域交互。

编辑:据我所知,“洋葱架构认为UI和数据访问属于同一层”的措辞可以用与预期不同的方式解释。关键是在洋葱架构中,用户界面和数据访问功能不是分层关系,就像分层架构中的情况一样。

答案 3 :(得分:-1)

六角形体系结构,也被称为港口,重点关注基础设施。

洋葱体系结构关注领域问题。

以持久层为例,您将使用ORM以便从数据存储发送和检索数据。 ORM表示基础结构问题,应放置在域问题之外,这称为适配器,以后可以用另一个ORM进行更改。在您的domani(洋葱)中,您将定义接口,以便您的域不关心基础结构,这些接口称为端口。