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

时间:2014-06-30 17:06:58

标签: 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();
    }
}

从控制器调用它?这个提到的案例应该存在于域层还是应用层?在这种情况下,什么是端口和适配器?如果我想让这个人醉酒 - 一个来自GET请求,一个来自某个php console person:drink John CLI命令怎么办?我应该如何构建我的应用程序?

2 个答案:

答案 0 :(得分:1)

TL; DR:我认为从DDD的角度来看,你基本上是正确的,但为了成为一个六边形设计,你应该能够在你的主要端口注册或公开你的用例:web ,控制台或“使用”建议为@chris-f-carroll

我目前在一个大型Java8代码库项目中工作,我们按照Clean Architecture / Vertical Slicing和CQRS的原则构建了我们的应用程序。我们有一个六角形,有6个端口:网络,控制台,数据库,日程安排,队列和电子邮件。

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

Alistair Cockburn tells“端口识别有目的的对话”。在我们的例子中,由于我们的设计意味着CQRS,我们的应用程序和HTTP协议之间的有目的的对话是关于公开查询和命令(我们的用例)。

这就是在我们的Web端口中公开(uri,query)或公开(uri,command)方法而不是get(uri,handler),post(uri,handler),put(uri,handler),delete的原因(uri,handler)等。

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

答案 1 :(得分:0)

是的,你做过/建议的是对的。

  • 用例位于应用程序层。但请注意,这是DDD的格言,与六边形架构无关。

  • 您的适配器

    1. Web服务器和您的控制器。
    2. Doctrine和您的DoctrinePersonRepository。
    3. 再次运行php可执行文件+您的控制器(假设您的控制器在CLI应用程序中重复使用)
  • 你的端口:Cockburn说“What exactly a port is and isn’t is largely a matter of taste."就个人而言,我说你有2个端口。我将其中一个命名为持久端口,你有1个适配器;我的名字另一个是'使用'端口,你有2个适配器。

六边形体系结构上的单页分页器当然是http://alistair.cockburn.us/Hexagonal+architecture