0

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

我的文件夹结构如下:

  1. 我的 UI 项目

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

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

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

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

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

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

现在代码明智:

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

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

    public class AddNewCustomer
    {
        private readonly IPersistence _persistence;

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

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

    }

端口项目中的接口。

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

接口项目中的实现。

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

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

4

1 回答 1

1

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

我会尽量正确地表达自己。希望能帮助到你。

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

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

Domain 层不直接依赖于 Infrastructure 层,而是依赖于端口(接口),端口的实现在 Infrastructure 层,对吗?

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

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

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

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

没关系。控制台和 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] = 每个驱动适配器一个

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

https://softwarecampament.wordpress.com/portsadapters

希望能帮助到你。

于 2019-01-24T00:32:06.113 回答