洋葱结构与六边形结构的比较

2024-04-11

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

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

另外,我认为使用其中一种架构或什至针对 N 层架构并没有真正的优势,如果做得不好,仅仅遵循其中任何一种架构都不会产生任何影响

使用其中一种比另一种有什么好处以及为什么要使用它?什么时候使用它?

Thanks


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

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

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

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

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

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

使用其中一种比另一种有什么好处?

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

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

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

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

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

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

何时使用它们?

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

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

希望我的解释有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

洋葱结构与六边形结构的比较 的相关文章

  • 4 层(对于 N 层)架构示例?

    最近 我的一个朋友向我询问 N 层架构 我能够通过示例向他解释 1 2 和 3 层架构 但当我想给出超过 3 层的例子时 我就陷入了困境 我用谷歌搜索并大量寻求帮助 但找不到任何像样的例子 事实上 它被命名为 N 层 这让我认为 N 可以是
  • Symfony2 多个应用程序和以 api 为中心的应用程序

    我正在尝试做一个以 Symfony2 为中心的应用程序 并重新使用 Web 前端应用程序的所有捆绑包 该应用程序将分为三个API FrontEnd BackEnd 以便我们可以像Service Bundle一样编码API并在整个应用程序中使
  • 当 Node.js 内部仍然依赖于线程时,它如何本质上更快?

    我刚刚观看了以下视频 Node js 简介 http www yuiblog com blog 2010 05 20 video dahl 并且仍然不明白如何获得速度优势 主要是 Ryan Dahl Node js 的创建者 曾经说过 No
  • MVC 模型对象、域对象和 DTO 之间有什么区别

    MVC 模型对象 域对象和 DTO 之间有什么区别 我的理解是 MVC 模型对象 对要由相应视图显示的数据进行建模 它可能不会直接映射到域对象 即可能包含来自一个或多个域对象的数据 客户端 可能包含业务逻辑 例如 验证 计算属性等 没有持久
  • 单例模式与 Web 应用程序,不是一个好主意!

    我发现了一些有趣的东西 我在调试其他东西时幸运地注意到了它 我正在应用 MVP 模式 并制作了一个单例控制器以在所有演示文稿之间共享 突然我发现有些事件在第一次回发时被调用一次 如果有两次回发则调用两次 如果有100次回发则调用100次 因
  • Angular 项目结构最佳实践

    这是我的 Angular 项目的目录结构 Angular 应用程序可以通过许多不同类型的组件而变得庞大 组织 Angular 应用程序的最佳实践是什么 app layout home layout header menu content d
  • Appengine 网站的架构指南?

    我使用 PHP 创建了难以维护的网站 因为它很容易做一些又快又脏的事情 我不想在 Google 的 appengine 上使用 Python Django 做同样的事情 使用 Django 和 appengine 创建网站有什么好的架构参考
  • 关于转向多层 Delphi 架构的建议

    我们有一个与 Firebird 紧密相关的相对较大的应用程序 存储过程 视图等 我们现在收到很多支持其他数据库的请求 我们还希望将很多功能从客户端转移到服务器 现在似乎是迁移到 3 4 层架构的好时机 我们已经了解了 DataSnap 20
  • 在 MVC 中拥有巨大的控制器或许多控制器更好?

    我们正在 ASP NET MVC 中构建一个相当大的 HR 应用程序 到目前为止 我们的控制器变得相当大 例如 我们有一个员工控制器 并且包含所有员工视图 个人信息 员工扣除额 家属等 每个视图都可能有多个操作或子视图 例如 CRUD 每个
  • Java 包结构中的模块与层

    我曾经把所有东西都放在这样的包中 com company app module1 com company app module2 但它使得基于包的 AOP 切入点变得困难 并导致需要 IDE 才能理解的巨大包 所以现在我意识到我需要一个更深
  • 什么是自以为是的软件?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我经常看到人们说某些软件 非常固执己见 或者微软倾向于编写 不固执己见 的框架 这实际上意味着
  • 如何通过WMI确定操作系统平台?

    我试图弄清楚 WMI 中是否有一个位置可以返回可在 所有 版本的 Windows 上工作的操作系统架构 即 32 位或 64 位 当我发现以下内容时 我以为我已经弄清楚了我的Win2k8系统 Win32 OperatingSystem OS
  • 宏定义确定大端还是小端机?

    是否有一行宏定义来确定机器的字节顺序 我正在使用以下代码 但将其转换为宏会太长 unsigned char test endian void int test var 1 unsigned char test endian unsigned
  • 如何建立一个类似Jira的SaaS网站?

    任何人都知道如何构建单租户 SaaS 应用程序 例如 Jira Wordpress com 等 其中每个客户都有一个单独的站点 但托管在公司服务器上 网络上似乎有很多关于多租户 SaaS 应用程序以及如何在 Heroku Openshift
  • 在 DDD 中,表示层可以同时使用 Repository 和 Service 类吗?

    如果表示层只应该使用服务 那么服务类必须公开存储库已实现的相同方法 以使它们可供表示层使用 这似乎是错误的 有人可以帮我澄清一下吗 我敢打赌 这似乎是错误的 因为您实际上并不需要这种抽象级别 应用服务有facades http en wik
  • C:epoll和多线程

    我需要创建专门的 HTTP 服务器 为此我计划使用 epoll sycall 但我想利用多个处理器 核心 但我无法提出架构解决方案 ATM我的想法如下 使用自己的epoll描述符创建多个线程 主线程接受连接并将它们分配给线程epoll 但还
  • 如何在无 null 设计中实现 List、Set 和 Map?

    当您在大多数情况下可以返回 null 空对象以避免 null 时 这很好 但是像 Collection 这样的对象呢 在爪哇 Map回报null if key in get key 地图上没有找到 我能想到的最好的避免方法null在这种情况
  • 微服务、amqp 和服务注册/发现

    我正在研究微服务架构 实际上我想知道一些事情 我非常同意使用 返回 服务发现来在基于 REST 的微服务上发出请求 我需要知道发出请求的服务 或至少是服务器集群的前端 在哪里 因此在这种情况下能够发现 ip port 是有意义的 但我想知道
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构

随机推荐