我是否正确了解端口和适配器/六角形体系结构?

时间:2019-01-22 13:04:26

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

端口和适配器体系结构旨在构建解耦的代码。域层不直接依赖于基础结构层,而是依赖于端口(接口),并且端口的实现在基础结构层中,对吧?

我的文件夹结构将如下:

  1. 我的UI项目

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

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

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

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

与基础架构相同,我可以使用实体框架一次,然后切换到dapper,而不会导致Core发生变化。

到目前为止还不错,还是我一路上错过了一些东西,还是错过了对体系结构的基本了解?

现在明智的代码:

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

在Core项目中找到的Application Service中的类。它使用依赖注入来访问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
        }
    }

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

1 个答案:

答案 0 :(得分:1)

  

到目前为止还不错,或者我一路上错过了什么,还是错过了   对体系结构的最基本的了解?

我会尽力表达自己的意思。希望对您有所帮助。

  

Ports and Adapters体系结构旨在构建解耦的代码。

是的。但这不是“本身”的主要目标。这是达到主要目标的一种方法,该方法是能够与超出应用程序范围的外部设备(硬件,软件,人等)隔离地进行测试。

  

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

您正在谈论图层。六角形建筑图案则没有。它只是说您拥有带有端口的应用程序(六边形),外部真实世界的设备(称为参与者)通过这些端口与应用程序进行交互。端口属于应用程序(与技术无关),并且端口与主体之间的交互是通过依赖于技术的适配器完成的。

  

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

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

  

可以切换传送机制(从控制台应用程序切换到网络   应用...),Core仍然可以正常工作。

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

  

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

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

  

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

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

我的文件夹(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] =每个驱动程序适配器一个

[应用名称] .adapter.driven。[驱动端口名称]。[角色名称]。[技术] =每个驱动适配器一个

我写了一篇有关六角形体系结构的文章,在其中解释了这种模式,并且我将发布一个实现示例。如果您想阅读,请点击以下链接:

https://softwarecampament.wordpress.com/portsadapters

希望有帮助。