Ports and Adaptersについて、自分なりの考え方を書いていこうと思います。
オリジナルのもとのは違う部分があるかもしれませんので、オリジナルのものが知りたい場合は、オリジナルのほうを参照してみてください。
Ports and Adaptersとはどういうものかというと、複数の問題領域(ドメイン)がある場合に、それらをどのように参照するのかを表したものになります。
例えば、GUIから内容を入力し、ビジネスロジックを実行し、データベースに内容を保存するようなアプリケーションを考えてみます。この場合、問題領域(ドメイン)として、以下のような3つを考えたとします。
Presentation DomainやPersistence Domainは、DDDではテクニカルドメインというように呼ばれたりしています。
これらのドメインを参照する方法としては、以下のようにしたり、
以下のようにしたりが考えられます。
上記のどちらも、ドメインを直接参照していますが、Ports and Adaptersでは、直接参照するのではなく、次のようにして参照します。
まず、それぞれのドメインについて、他のドメインに公開したり、他のドメインの参照が必要な部分をPortとして定義します。前者をPrimary port、後者をSecondary portと呼びます。
次に、各PortをAdapterが参照し、ドメイン同士を関連付けるようにします。Adapterでは、各ドメインのモデルの変換を行い、Port同士をつなぐ役割を果たします。
このようにすることによって、各ドメインが密に関連するのではなく、独立して存在することになりますので、拡張がしやすくなります。例えば、ビジネスドメインをWebAPI経由で呼び出すようにしたい場合、Adapterを付け替えるだけで対応することができます。また、各ドメインが独立しているため、ユニットテストを行う場合も他のドメインの影響を受けずに行うことができます。
次回は、もう少し具体的にPorts and Adaptersを適用してみたいと思います。