洋葱-六边形架构依赖混淆

Onion-hexagonal architecture dependency confusion

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

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

在onion/hex架构中,内部层应该独立于外部层,但它是如何实现的(请注意我的 java/spring 背景)

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

如果我要调用 outer layer,我将使用接口。 所以接口在内层,实现在外层。现在我独立于外。就是这个?就是关于API放在哪里?

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

非常感谢您提前澄清。

哇,这么多问题。我会尝试一个一个地完成它们

In onion/hex architecture the outer layers should be independent from inner ones, but how is it implemented(please note my java/spring background)

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

In N-layered you auto-wire the N+1th layer components. I see the direction of the dependency, but how can you revert it:-/

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

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

此界面是您域的一部分。您当然有该接口的实现,可能基于 Jdbc(或内存列表或 Web 服务)。此实现位于洋葱的外层。由于接口的实现依赖于内部,正如所要求的那样。

If I'm about to call outer layer, I will use interface. So the interface is in inner and implementation in outer layer. Now I'm independent on outer. This is it?

It is just about where the API is placed?

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

Anyway the hex/onion should be independent from dependency resolution, so does it mean I should not use @Autowire, @Inject etc??

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

What I don't see is what is the difference(implementation) from n-layer structure.

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