architecture - 六边形架构 : How to implement driver ports

标签 architecture hexagonal-architecture

我正在研究使用分层架构的端口和适配器模式。

所以我将有以下几层:

  • 框架/基础设施 - 即 ASP.NET MVC、 Entity Framework 、SMTP 客户端
  • 应用程序 - 将您的应用程序整合在一起并在您的域上执行操作的逻辑。
  • 域 - 定义域中操作的工作方式。定义域对象之间的关系

阅读后https://softwarecampament.wordpress.com/portsadapters/#tc2-3 , https://fideloper.com/hexagonal-architecture以及其他几篇文章以及多个 YouTube 演讲,我仍然在努力解决如何实现驱动程序端口和适配器的问题。我理解驱动端口和适配器的想法,因为这是我使用简单的分层架构所做的事情。

但我仍然不明白驱动程序端口和适配器是如何实现的。

根据我的理解,驱动程序端口定义了其外部的层应使用其所在层的方式。适配器是使用该端口的层上该端口的实现。

但是我正在努力解决一些问题...应用程序层如何实现领域层的接口(interface)?这难道不要求应用层了解域层的交互吗?这完全破坏了使用界面的初衷。如果领域层提供了一个外部事物应该使用的接口(interface),并且该接口(interface)的适配器由使用该接口(interface)的层实现,则意味着该接口(interface)的用户也在实现该接口(interface)本身。这就像外层告诉内层如何工作......这违背了解耦的本质,甚至违背了一般接口(interface)的本质。

听起来业务层正在告诉应用程序层,“这是我为您提供的接口(interface)......我不知道它将如何工作,所以您告诉我。”但那为什么还要有界面呢?

这里有一些代码来演示我所想象的内容:

applicationLayer.UserRegisteringUseCasePort

public interface UserRegisteringUseCasePort
{
    void Register(string username, string password, string passwordConfirm, string name);
}

frameworkLayer.UserRegisteringUseCaseAdapter

public class UserRegisteringUseCaseAdapter : UserRegisteringUseCasePort
{
    private IUserRepository _userRepo;

    public class UserRegisteringUseCaseAdapter(IUserRepository userRepo)
    {
        _userRepo = userRepo;
    }

    public void Register(string username, string password, string passwordConfirm, string name)
    {
        // validation logic
        //... such as:
        if (password != passwordConfirm) {
            throw new Exception("password no match password confirm!");
        }
        userRepo.Add(new User(username, password, name));
    }
}

对我来说,这看起来很糟糕,因为现在你已经强制框架层进行验证,这应该是域逻辑的一部分(自从我们停在应用程序层以来,它甚至没有机会这样做)。这也意味着应用程序层实际上并没有将业务逻辑整合在一起......它只是说它想要执行什么操作,但让调用者决定如何执行它。应该反过来吧?

摘要

我知道我说了很多,所以让我总结一下...驱动程序端口和适配器如何工作?它们应该如何在现实场景中使用/实现?

最佳答案

How do driver ports and adapters work? How should they be used/implemented in real world scenarios?

驱动程序端口是“应用程序”的 API(在 HexArch 术语中,应用程序是整个六边形,不要与应用程序层混淆)。他们向外界提供应用程序的功能(用例、用户故事或任何你所说的东西)。

驱动程序适配器不实现驱动程序端口。这是很多人都会犯的错误。驱动程序适配器是使用驱动程序端口的应用程序外部的软件组件。驱动程序端口是驱动程序适配器的依赖项。驱动程序适配器示例:MVC Web Controller 、REST Controller 、自动化测试框架等

驱动程序端口的实现是应用程序本身的业务逻辑。这是用例实现。在您的例子中,您将六边形分为两层:应用程序层和域。那么驱动程序端口的实现将是一个应用程序服务实现,它编排域对象以执行用例功能。

希望我的解释有帮助。

关于architecture - 六边形架构 : How to implement driver ports,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56694604/

相关文章:

reactjs - React Core Layout 组件架构

architecture - Symfony3 - 为什么测试现在不再包含在 bundle 中?

java - 使用 Cucumber 进行回归组件测试。应该测试的层是否有边界?

ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器

events - DDD 中的应用程序事件?

oop - 如何设计业务逻辑层

C# 架构继承覆盖不同的签名?

php - 哪种Web应用模块化结构更好?

go - 六边形架构中的哪些地方适合周期性的后台任务?