【问题标题】:Did I understand Ports & Adapters/Hexagonal architecture correctly?我是否正确理解端口和适配器/六角架构?
【发布时间】:2019-01-22 13:04:25
【问题描述】:

端口和适配器架构旨在构建解耦代码。 Domain 层不直接依赖于 Infrastructure 层,而是依赖于端口(接口),端口的实现在 Infrastructure 层,对吧?

我的文件夹结构如下:

  1. 我的 UI 项目

  2. 应用程序核心项目,包含应用程序服务、域服务和域模型。

  3. 端口项目:它包含严格的接口。

  4. 基础设施项目,我在其中有一个持久性文件夹。

交付机制可以切换(从控制台应用程序到 Web 应用程序...),Core 仍然可以正常工作。

对于基础架构也是如此,我可以使用一次实体框架,然后切换到 dapper,而不会导致核心发生变化。

到目前为止一切都很好,还是我错过了一些东西,或者我错过了对架构的基本理解?

现在代码明智:

如果我有一个控制台应用程序,我必须在其中键入命令并创建一个客户。

Core 项目中的应用程序服务中的一个类。它使用依赖注入来访问 IPersistence 的实现。

    public class AddNewCustomer
    {
        private readonly IPersistence _persistence;

        public AddNewCustomer(IPersistence persistence)
        {
            _persistence = persistence;
        }

        public bool addToDb(customer customer)
        {
            return _persistence.add(customer);
        }

    }

port 项目中的接口。

    public interface IPersistence
    {
        bool add(Customer customer);
    }

接口项目中的实现。

    public class Persistence: IPersistence
    {
        public bool add(customer customer)
        {
           //inserts into DB
        }
    }

端口项目是否应该严格关注接口? 您如何构建(文件夹结构)您的端口和适配器项目?

【问题讨论】:

标签: c# dependency-injection .net-core hexagonal-architecture


【解决方案1】:

到目前为止一切顺利,还是我错过了一些东西,或者我错过了 对架构的基本了解?

我会尽量正确地表达自己。希望对您有所帮助。

端口和适配器架构旨在构建解耦代码。

确实如此。但这不是“本身”的主要目标。这是实现主要目标的一种方式,即能够独立于超出应用程序范围的外部设备(硬件、软件、人类……)来测试应用程序。

Domain 层不直接依赖于 Infrastructure 层, 相反,它取决于端口(接口)和实现 端口在基础设施层,对吧?

您在谈论图层。六边形架构模式没有。它只是说您拥有带有端口的应用程序(六边形),外部现实世界设备(称为参与者)通过这些端口与应用程序交互。端口属于应用程序(与技术无关),端口与参与者的交互是通过依赖于技术的适配器完成的。

应用程序核心的项目,其中包含应用程序 服务、领域服务和领域模型。

在这里我只想评论一下,六边形架构模式并没有说明应用程序的内部结构(六边形)。

交付机制可以切换(从控制台应用程序到网页 app...),Core 仍然可以正常工作。

没关系。控制台和 Web 应用程序是驱动应用程序的适配器。他们使用驱动程序端口(向外部参与者提供应用程序功能的端口)。

我可以使用实体框架一次,然后切换到 dapper 不会导致核心发生变化。

没关系。它们将是持久端口的适配器,持久端口是驱动端口(驱动适配器实现驱动端口以与外部参与者交互)。

端口项目是否应该严格关注接口?怎么做 您构建(文件夹结构)您的端口和适配器项目?

我有一个六边形的“java 9 模块”(你称之为核心)。端口是我导出的模块包。每个端口都是一个包,具有定义端口操作的服务接口。但是你可以有更多的类(代表操作参数,如果你不想将内部对象暴露给外部世界,则映射器,......)。实施取决于您。

我的文件夹(java包)结构是:

六边形:

[app-name].hexagon.internal = 应用程序内部

[app-name].hexagon.driver.[driver-port-name] = 一个或每个驱动程序端口(应用程序的 API)

[app-name].hexagon.driven.[driven-port-name] = 一个或每个驱动端口(应用程序的 SPI)

使用技术的端口和参与者之间的适配器:

[app-name].adapter.driver.[driver-port-name].[actor-name].[technology] = 每个驱动适配器一个

[app-name].adapter.driven.[driven-port-name].[actor-name].[technology] = 每个驱动适配器一个

我写了一篇关于六边形架构的文章,我在其中解释了该模式,并且我即将发布一个实现示例。如果你想阅读它,这里是链接:

https://softwarecampament.wordpress.com/portsadapters

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多