architecture - 六边形架构 - 一个简单的用例

标签 architecture domain-driven-design n-tier-architecture hexagonal-architecture

我已经阅读了很多关于六边形架构的文章,并且我确实了解了大部分概念(嗯,我希望我了解),但我没有找到任何 示例 该架构的用例明智。

假设我的应用领域模型是让人醉的。整个业务逻辑包含在Person驻留在域层中的类。

class Person
{
    private $name;
    private $age;

    function __construct($name, $age)
    {
        $this->age  = $age;
        $this->name = $name;
    }

    public function drink()
    {
        if ($this->age < 18) {
            echo $this->name . ' cant drink';
        }

        echo $this->name . ' drinks tequila';
    }
}

域层还包含一个 PersonRepository
interface PersonRepository
{
    public function findPersonByName($name);
}

实现者:

class DoctrinePersonRepository implements PersonRepository
{
    public function findPersonByName($name)
    {
        // actual retrieving
    }
}

假设我想通过访问:GET /person/johnDoe/drink 让一个人喝醉。 .
我应该创建一个像这样的用例:

class MakePersonDrinkCase
{
    /**
     * @var PersonRepository
     */
    private $personRepository;

    function __construct(PersonRepository $personRepository)
    {
        $this->personRepository = $personRepository;
    }

    function makePersonDrunk($name)
    {
        $person = $this->personRepository->findPersonByName($name);

        if ($name) {
            throw new \Exception('Person not found');
        }

        $person->drink();
    }
}

并从 Controller 调用它?这个提到的案例应该驻留在领域层还是应用层?在这种情况下,什么是端口和适配器?如果我想有办法让这个人喝醉——一种来自 GET 请求,另一种来自某些 php console person:drink John CLI 命令?我应该如何构建我的应用程序?

最佳答案

TL;DR:我认为从 DDD 的角度来看,您基本上是对的,但是为了成为六边形设计,您应该能够在您的主要端口中注册或公开您的用例:Web、控制台或“用法”为 @chris-f-carroll建议。

我目前在一个大型 Java8 代码库项目中工作,我们按照 Clean Architecture/Vertical Slicing 和 CQRS 的原则构建了我们的应用程序。我们有一个带有 6 个端口的 Hexagon:Web、控制台、数据库、调度、队列和电子邮件。

为了初始化我们的应用程序,我们创建了所有必需的适配器并使用它们来创建我们的应用程序实例。然后我们的应用程序模块在主端口适配器上显式注册它们的用例。最后我们启动我们的主要端口适配器并且应用程序正在运行。

Alistair Cockburn tells “端口标识有目的的对话”。在我们的例子中,正如我们的设计所暗示的 CQRS,我们的应用程序和 HTTP 协议(protocol)之间的有目的的对话是关于公开查询和命令(我们的用例)。

这就是为什么在我们的网络端口中使用expose(uri, query) 或expose(uri, command) 方法而不是get(uri, handler), post(uri, handler), put(uri, handler), delete(uri,处理程序)等。

如何公开这些查询和命令(即作为 HTTP GET 或 POST)是我的六边形不需要知道的 Web 端口适配器的实现细节。

关于architecture - 六边形架构 - 一个简单的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24495352/

相关文章:

Java继承Hibernate实体

architecture - 限界上下文和领域专家的参与

c# - Nhibernate/Domain 对象使用来自工厂的随机数据生成测试对象

EventSourcing 和 DDD 实体事件

java - 听众是一个很好的解决方案吗?它们是如何实现的?

Flutter 实现整洁架构的方式

rest - 微服务、REST、事件源和数据一致性

c# - 带有模型的 NTier 逻辑层,处理 CRUD

database - 关于转向多层 Delphi 架构的建议

c# - 如何在 n 层架构中将 Entity Framework 模型类映射到业务层类 - ASP.NET-MVC