洋葱结构与六角形相比

Onion architecture compared to hexagonal

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

它们之间有什么区别?

我也看不出使用一个比另一个更好甚至对抗 N 层架构没有真正的优势,如果做得不好,只是遵循其中任何一个都不会有任何区别

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

谢谢

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

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

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


编辑:我知道 "the onion architecture considers UI and data access to be part of the same layer" 的措辞可以用与预期不同的方式来解释。关键是在洋葱架构中,用户界面和数据访问功能并不像分层架构那样处于层次关系中。

What are the differences between them if any?

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

Hexagonal(原名"Ports & Adapters"的别名):没有层。您拥有应用程序、端口和适配器。端口属于应用程序,它们是应用程序的API/SPI。适配器在应用程序之外,每个适配器都依赖于应用程序的一个端口。

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

实施六边形权利应该将适配器彼此分开,每个适配器应该只依赖于它的端口 uses/implements(取决于端口是驱动器还是从动器)。

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

What are the benefits of using one over the other?

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

Onion的好处,就是从上面推导出来的。由于六边形有很多工件,如果项目很大,整个项目的构建需要很多时间。

Why you would use it? When to use it?

使用它们中的任何一个的意义在于,您可以专注于要解决的实际问题,而无需使用任何技术或框架。该应用程序与技术无关,并且很容易从一个框架迁移到另一个框架。因此,它们都被称为 "clean" 架构。您的应用程序核心没有框架代码、注释等。

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

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

什么时候使用它们?

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

就个人而言,我喜欢 "Ports and Adapters" 胜过其他人。

希望我的解释对您有所帮助。

之前的答案对洋葱架构的陈述根本不正确。他们断言 "in Onion the UI and Data access are part of the same layer"。混淆可能来自于认为所有层都与它们之上和之下的一切对话。

实际上,洋葱图不能很好地代表洋葱架构。关键要点是核心领域层与任何周围的层都是不可知的,并且周围的层通常也彼此不可知。通常这意味着 UI 与服务对话,服务与数据层和域层对话。 UI不直接与其他层交互,层间交互通过依赖注入和接口隔离抽象出来。

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

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

Mark Seeman 的精彩 post 有助于阐明差异(如果有的话)是边缘的和语义的:Layers, Onions, Ports, Adapters: it's all the same

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

洋葱架构专注于领域问题。

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

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

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