51

它们之间有什么区别吗(洋葱|六边形),据我了解,它们是相同的,它们专注于应用程序核心的领域,并且应该与技术/框架无关。

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

此外,我认为使用一个比另一个甚至反对 N 层架构没有真正的优势,如果做得不好,仅仅遵循它们中的任何一个都不会产生任何影响

使用其中一个有什么好处,为什么要使用它?什么时候使用它?

谢谢

4

5 回答 5

59

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

洋葱:有层,依赖关系总是指向内部,即一个层可以使用它里面的任何层。内层是领域模型,外层是基础设施,但它们之间的层数可能会有所不同。

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

一些人的困惑是,在实现六边形架构时,大多数人并没有将每个适配器物理地放在一个工件中,而是将所有适配器放在一个工件中(如基础设施层)。而且他们还依赖于整个应用程序上的适配器,而不仅仅是他们使用的端口。所以它实际上是一个洋葱。

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

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

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

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

洋葱的好处源于以上。由于六边形有很多工件,如果项目很大,整个项目的构建会花费很多时间。

你为什么要用它?什么时候使用它?

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

那么...为什么要使用它们?

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

什么时候使用它们?

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

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

希望我的解释有所帮助。

于 2018-04-26T21:03:03.923 回答
21

以前的答案对 Onion 架构做出了根本错误的陈述。他们断言“在 Onion 中,UI 和数据访问是同一层的一部分”。混淆可能来自于认为所有层都与它们上方和下方的所有内容对话。

实际上,洋葱图是洋葱架构的不良表示。关键要点是核心域层与任何周围层无关,并且周围层通常也彼此无关。通常这意味着 UI 与 Service 对话,后者与 Data 和 Domain 层对话。UI 不直接与其他层交互,层交互是通过使用依赖注入和接口隔离来抽象的。

据我所知,没有任何架构模式建议混合数据访问和 UI(一些,例如Active Record,混合业务和数据访问)。另外,有些技术可以生成避免层的代码——快速开发工具通常会这样做,但这些工具更倾向于部署速度而不是设计和可维护性。

Onion、Hexagonal 和 Ports and Adapters 实际上都是同一个概念架构的不同名称。

Mark Seeman 有一篇很棒的文章,有助于阐明差异(如果有的话)是边缘和语义的:层、洋葱、端口、适配器:都是一样的

于 2019-05-08T16:32:54.433 回答
1

六边形架构,也称为端口和适配器,专注于基础设施问题。

洋葱架构关注领域问题。

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

于 2020-08-01T14:05:33.440 回答
0

区别之一是在洋葱架构中,您可以直接从 UI 访问数据库。

在六边形架构中,任何对数据库的 UI 访问都必须通过 Inbound 端口并遵循域规则。

于 2021-10-09T09:05:00.053 回答
0

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

为什么用户界面和数据访问在同一层?洋葱架构的核心在于具有业务逻辑的域。这是主要焦点。域不在任何其他层之上或之下。它是最中心的。用户界面、其余端点等对于域来说是次要的,就像数据存储库一样。

端口和适配器架构(它是六边形架构的另一个名称)通过其名称清楚地表明了这一点:有任意数量的端口充当域和外部之间的接口。适配器实现端口,以便端口可以与域交互。


编辑:我理解“洋葱架构将 UI 和数据访问视为同一层的一部分”的措辞可以以不同于预期的方式解释。关键是在洋葱架构中,用户界面和数据访问功能并不像分层架构那样处于层次关系中。

于 2018-04-26T10:27:58.117 回答