洋葱六边形结构依赖混淆

时间:2015-03-17 10:50:58

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

我在理解六边形(端口适配器)架构中依赖的含义时遇到了问题。

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

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

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

如果我要打电话给outer layer,我会使用界面。 所以界面在内层,在外层实现。现在我独立于外在。就是这个?它只是放置API的位置?

无论如何,hex / onion应该独立于依赖性解析,所以它是否意味着我不应该使用@Autowire,@ Inject等?

非常感谢您提前澄清。

1 个答案:

答案 0 :(得分:5)

哇,这是很多问题。我会尝试逐一浏览它们

  

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

对于建筑模式,你可以看到许多不同的解释,但是这一点让我觉得很奇怪。洋葱图案的内部部分是您的域逻辑,而外部部件是其他域或技术(数据库,Web服务......)的适配器。您不希望您的域依赖于这些技术细节,因此外部部分可能取决于内部部分,而不是相反。

  

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

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

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

此界面是您网域的一部分。您当然有一个该接口的实现,可能基于Jdbc(或内存列表或Web服务)。这种实施方式生活在洋葱的外层。由于实现接口依赖于内部部分,按要求。

  

如果我要打电话给外层,我会使用界面。所以界面在内层,在外层实现。现在我独立于外在。就是这个?

  

这是关于API的放置位置?

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

  

无论如何,hex / onion应该独立于依赖性解析,所以它是否意味着我不应该使用@Autowire,@ Inject等?

现在可以争论永恒了。严格来说,这些注释是依赖于您的DI-Framework。但是,由于这些已经标准化,它们变得更加依赖于您的语言(在没有进入无限递归和收集大量语言设计经验的情况下,您无法避免)。对Annotations的依赖性,根据定义,它不能包含任何实现,这不是一个问题,我个人很好,我的代码中包含它们。

  

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

洋葱结构是n层结构的一般术语的特定变体。