7

私は六角形のアーキテクチャについて多くのことを読んできましたが、ほとんどの概念を理解しています (そうであることを願っています) 。そのアーキテクチャのユースケースの例は見つかりませんでした。

私のアプリケーション ドメイン モデルが人々を酔わせることだとしましょう。ビジネスロジック全体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();
    }
}

コントローラーから呼び出しますか?この言及されたケースは、ドメイン層またはアプリケーション層に存在する必要がありますか? この場合のポートとアダプターは何ですか? この人を酔わせる方法が必要な場合はどうすればよいですか? 1 つは GET 要求から、もう 1 つはphp console person:drink JohnCLI コマンドからですか? アプリをどのように構成すればよいですか?

4

2 に答える 2

2

TL;DR: DDD の観点からは、基本的には正しいと思いますが、Hexagonal 設計にするためには、プライマリ ポート (Web、コンソール、または@chris-f-carrollが示唆する「使用法」 。

私は現在、大きな Java8 コードベース プロジェクトに取り組んでおり、クリーン アーキテクチャ/垂直スライシングと CQRS の原則に従ってアプリケーションを構築しました。Web、コンソール、データベース、スケジューリング、キュー、および電子メールの 6 つのポートを備えた Hexagon があります。

アプリを初期化するために、必要なすべてのアダプターを作成し、それらを使用してアプリ インスタンスを作成します。次に、アプリのモジュールは、プライマリ ポート アダプターにユース ケースを明示的に登録します。最後に、プライマリ ポート アダプターを起動すると、アプリが実行されます。

Alistair Cockburn は、「ポートは意図的な会話を識別します」と語っています。私たちの場合、私たちの設計は CQRS を暗示しているので、アプリケーションと HTTP プロトコルの間の意図的な会話は、クエリとコマンド (私たちのユース ケース) を公開することです。

get(uri, handler)、post(uri, handler)、put(uri, handler)、delete(uri,ハンドラー)など。

これらのクエリとコマンドがどのように公開されるか (つまり、HTTP GET または POST として) は、六角形が知る必要のない Web ポート アダプターの実装の詳細です。

于 2015-06-12T14:25:48.573 に答える
0

はい、あなたが行ったこと/提案したことは正しいです。

  • ユースケースはアプリケーション層に入ります。ただし、これは特に DDD の口述であり、六角形のアーキテクチャとは関係ないことに注意してください。

  • あなたのアダプターは

    1. Web サーバーとコントローラー。
    2. DoctrinePersonRepository と一緒に Doctrine。
    3. php 実行可能ファイル + コントローラー (コントローラーが CLI アプリで再利用されていると仮定)
  • あなたのポート: コックバーンは、「正確にポートが何であり、そうではないかは、主に好みの問題です」と述べています。個人的には、ポートが2つあると思います。そのうちの 1 つを、1 つのアダプターを持つ永続ポートと呼びます。もう 1 つは「用途」ポートと名付け、2 つのアダプターを使用します。

もちろん、六角形アーキテクチャのワンページャーはhttp://alistair.cockburn.us/Hexagonal+architectureです。

于 2014-07-01T14:04:21.177 に答える