【问题标题】:Onion-hexagonal architecture dependency confusion洋葱六边形架构依赖混淆
【发布时间】:2015-05-19 18:27:52
【问题描述】:

我无法理解六边形(端口适配器)架构中依赖项的含义。

Here他们有很好的照片。我没有看到与 n 层结构有什么区别(实现)。

在洋葱/十六进制架构中,inner 层应该独立于 outer 层,但是它是如何实现的(请注意我的 java/spring 背景)

在 N 层中,您可以自动连接第 N+1 层组件。我看到了依赖的方向,但是你怎么能恢复它:-/

如果我要打电话给outer layer,我会使用接口。 所以接口在内层,实现在外层。现在我在外面独立了。就是这个?就是 API 放在哪里了?

无论如何,十六进制/洋葱应该独立于依赖解析,所以这是否意味着我不应该使用@Autowire、@Inject 等??

非常感谢您提前澄清。

【问题讨论】:

    标签: java spring architecture dependency-injection onion-architecture


    【解决方案1】:

    哇,有很多问题。我会尝试一个一个地浏览它们

    在洋葱/十六进制架构中,外层应该独立于内层,但它是如何实现的(请注意我的 java/spring 背景)

    对于架构模式,您会看到很多不同的解释,但这个让我觉得很奇怪。洋葱模式的内部部分是您的域逻辑,而外部部分是其他域或技术(数据库、Web 服务......)的适配器。您不希望您的域依赖于这些技术细节,因此外部部分可能依赖于内部部分,而不是相反。

    在 N 层中,您可以自动连接第 N+1 层组件。我看到了依赖的方向,但是你怎么能恢复它:-/

    这称为控制反转。您的域(内部)通常需要调用适配器(例如您的数据库访问逻辑),因此在运行时必须存在依赖关系。但是在编译时你不想要这样的依赖,以便能够替换使用的特定技术。你可以通过使用接口和依赖注入来做到这一点。示例:您的域可能需要访问所有品牌的列表。为此,您创建了一个这样的界面:

    public interface BrandRepository{
        public Set[Brand] all()
    }
    

    此界面是您域的一部分。您当然有该接口的实现,可能基于 Jdbc(或 In-Memory-List 或 Web 服务)。这个实现存在于洋葱的外层。由于实现接口依赖于内部,根据要求。

    如果我要调用外层,我会使用接口。所以接口在内层,实现在外层。现在我在外面独立了。就是这个?

    是的

    就是 API 放在哪里了?

    难以回答:您的 API 是什么?您的域模型是适配器的 API。适配器是您系统或其他系统其他部分的 API。

    无论如何,十六进制/洋葱应该独立于依赖解析,所以这是否意味着我不应该使用@Autowire、@Inject 等??

    现在人们可以争论很久了。严格来说,这些注释依赖于您的 DI 框架。但是,由于这些变得标准化,它们变得更多地依赖于您的语言(如果不进入无限递归并收集大量语言设计经验,就无法避免这种情况)。对注解的依赖,根据定义,它不能包含任何实现,这不是什么大问题,我个人对在我的代码中使用它们感到满意。

    我没有看到与 n 层结构有什么区别(实现)。

    洋葱结构是 n 层架构这个相当笼统的术语的特定变体。

    【讨论】:

    • 喜欢they say 基本规则是所有代码都可以依赖于更中心的层,但代码不能依赖于远离核心的层。换句话说,所有耦合都朝向中心。我有它的第一部分应该反之亦然抱歉会解决这个抱歉
    • 总而言之,走向领域就像 3 层结构,您将使用内层的接口并自动连接内部实现,去外缘将从外层注入实现。但是数据访问层依赖领域接口真的好吗,WS呢?如果没有域中保存的接口,就不可能重用外部服务。感觉“适配器”现在已绑定到域,不是吗?
    • 什么是WS?是的,适配器位于您域的边界。
    • 注意洋葱和六边形架构之间的一个非常重要的区别是,在洋葱中,层可以依赖于更多的中心层S。在六边形架构中,虽然层有时显示为相互缠绕看起来像一个洋葱,但每个“层”可能只依赖于直接相邻的层。在此处查看大的 DEPENDENCIES 图形:fideloper.com/hexagonal-architecture
    猜你喜欢
    • 2018-10-06
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 2011-10-09
    • 2020-03-23
    • 2011-12-08
    相关资源
    最近更新 更多