Help us understand the problem. What is going on with this article?

ドメインオブジェクトを中心としたClean Architecture のためのレイヤー構成

More than 1 year has passed since last update.

ドメインオブジェクトを中心としたClean Architectureは、どういうレイヤー構成にするとよいか、簡単にまとめてみた。

イメージ

たぶん、こんな感じになるはず。通常は円状に表現するが、わかりにくいので層状に書いてみた。

レイヤー構成

赤い部分の層は、直接依存の方向が上から下です。グレー部分の層は、契約だけが定義された独立した層で、ユースケース層やインターフェイス層から依存できるものとします。

  • インターフェイス(アダプタ)層
    • 内外とのデータ形式の変換が主な役割
    • コントローラ、プレゼンター(内部から外部へデータ形式を変換する責務),ゲートウェイ(外部と通信する責務。DBやRPC)
  • ユースケース層
    • アプリーケーション層ともいう
    • アプリケーション固有のビジネスルールをカプセル化する
  • ドメイン層
    • Clean Architecture本では、中心にはエンティティとだけ書かれているが、DDDでは中心はドメイン層になる
    • ドメインモデルを表現した実装
  • 契約層(契約だけを表現した型を配置)
    • ⚠️こういう層を定義するというのはClean Architectureにはない、アイデアです。
    • Input Port, Output Port, DTO
    • リポジトリ
    • DAO, Record

DIによるオブジェクトグラフの構築

  • コントローラに対してDIするオブジェクト
    • ユースケース
    • プレゼンター
  • ユースケースに対してDIするオブジェクト
    • リポジトリ
    • DAO(CQRSのリード責務なら)

インフラストラクチャ層はどこに行った?

インフラストラクチャ層は、要件が変化しても依存し続ける層。すべての層が依存できる汎用的な技術基盤(言語を拡張するような実装が提供されることが多い)。Clean Architectureでも導入できる。インターフェイス層とごっちゃにしないこと。

所感

  • 永続化に関する層が上位に配置される以外は、伝統的なレイヤー化アーキテクチャと基本的に差がないと考えてよい。あとは、Input Port, Output Portが仰々しく見えるだけ。
  • Clean Architecture本によると、Input PortとOutput Portはバウンダリの抽象っぽい。バウンダリだけに限らず、永続化に関するInput Port, Output Portの概念があってもよい気がするが、用語の使い方はClean Architecture本に合わせておいた。
  • インターフェイス層からユースケースの実装を直接呼べてしまうので、Input Portの抽象がどこまで必要かわからない。そもそも抽象がなくてもいいのではないか。Output Portは間接依存のために必要。コールバックとして抽象化する方法もあるし、単にプレゼンターのインターフェイスだけを定義する方法もある。
  • 集約は本来ライフサイクルのためのパターンの一つなので、インターフェイス層ではないか説がある。集約にも契約と実装に分離し、実装はインターフェイス層に配置した方がいいかもしれない。
j5ik2o
Chatwork 2014年7月入社/テックリードとして、次世代チャットワーク開発に従事。業界歴25年、小学四年生で初めてプログラムを組む。FA系、オープン系、ウェブ系など様々の現場を経験。大手Web企業において、Scalaやドメイン駆動設計を採用した大規模な基盤系システムの開発に従事。現職では、サーバサイドのアーキテクトとして、メッセージングシステムやOAuth関連プロダクトの開発を担当している
http://blog.j5ik2o.me
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした