如果有的话,它们之间有什么区别?
Onion:存在多个层,其依赖关系始终指向内部,即一个层可以使用其内部的任何层。内层是领域模型,外层是基础设施,但层数可能会有所不同。
六角形(它是原始名称“端口和适配器”的替代名称):没有层。您拥有应用程序、端口和适配器。这些端口属于应用程序,它们是应用程序的 API/SPI。适配器位于应用程序之外,每个适配器都依赖于应用程序的一个端口。
有些人的困惑是,在实现六边形架构时,大多数人不会将每个适配器物理地放入一个工件中,而是将所有适配器放在一个工件中(如基础设施层)。而且它们还依赖于整个应用程序上的适配器,而不仅仅是它们使用的端口。所以实际上它是一个洋葱。
实现六边形右侧应该将适配器彼此分开,并且每个适配器应该仅依赖于它使用/实现的端口(取决于端口是驱动程序还是从动端口)。
另一个区别是六边形没有提及六边形内部的结构(应用程序)。
使用其中一种比另一种有什么好处?
六边形的好处是它更加模块化,可以清楚地分离组件,防止它们之间的代码泄漏。另一方面,从这个意义上讲,洋葱更危险,因为您可以直接从 UI 访问数据库(它们都属于同一层)。
洋葱的好处就源于上述。由于六边形有很多工件,如果项目很大,整个项目的构建应该花费很多时间。
为什么你会使用它?什么时候使用它?
使用它们中的任何一个的要点是,您可以专注于要解决的实际问题,而不使用任何技术或框架。该应用程序与技术无关,并且很容易从一个框架迁移到另一个框架。因此,它们都被称为“干净”架构。您的应用程序核心没有框架代码、注释等。
那么...为什么要使用它们?
因为您提高了可维护性、可测试性,并且您拥有干净的代码。
何时使用它们?
我宁愿说什么时候不使用它们。如果您正在开发的应用程序并不复杂,例如,它只是一个 CRUD,则可能不值得使用它们。
就我个人而言,我更喜欢“端口和适配器”而不是其他。
希望我的解释有帮助。