メインコンテンツまでスキップ

🧩 Domain Model Layered(ドメインモデルレイヤード)

✅ このスタイルの概要

Classic Layered をベースにしつつ、 Domain 層にリッチなドメインモデル(集約・エンティティ・値オブジェクト)を中心に据えたスタイル。 DDD の考え方と相性が良いレイヤードアーキテクチャ。

✅ 解決しようとした問題

Classic Layered では、次のような問題が起こりがち:

  • Domain 層が「DTO 置き場」や共通関数置き場になり、実質的に空洞化する
  • ビジネスルールが Application / Service 層に散らばる
  • ドメインの複雑さをコードから読み取りづらい

Domain Model Layered はこれに対して、

「ドメインの概念をコード上のクラス・メソッドとして表現し、 ビジネスルールを Domain 層に集約する」

という考え方で応える。

✅ 基本思想・ルール

レイヤー構造そのものは Classic Layered に近いが、 Domain 層の扱いが決定的に異なる。

  • Domain 層に:
    • エンティティ
    • 値オブジェクト
    • ドメインサービス
    • 集約 などのドメインオブジェクトを配置
  • アプリケーション固有のユースケースの流れは Application 層
  • インフラ依存(DB, 外部 API)は Infrastructure 層

依存関係としては:

  • Application → Domain
  • Infrastructure → Domain

のような形が理想とされる(実際には完全分離は難しいが、方向性として)。

現実の実装では、ORM(JPA / Hibernate など)のアノテーションをドメインモデルに直接付与するケースも多く、結果として Domain → Infrastructure の依存が残ることがある。この点が、依存方向をより厳密に分離しようとする Hexagonal / Clean Architecture などの“Dependency Rule 強化系”スタイルとの違いとなる。

概念図(Conceptual Diagram)

✅ 得意なアプリケーション

  • 業務ルールが複雑な B2B SaaS / エンタープライズシステム
  • 状態遷移・不変条件・計算ロジックが重要な領域(金融・在庫・料金計算など)
  • ドメインエキスパートと「ドメイン言語」で会話しながら開発するプロジェクト

Domain Model Layered は、ドメインの複雑さがビジネスのコア価値である 場合に特に力を発揮する。

❌ 不向きなケース

  • CRUD が中心でドメインルールが単純なアプリ
  • DB スキーマ ≒ 画面項目、という構造で十分なシステム
  • チームのオブジェクト指向・DDD への習熟度が低く、むしろ複雑になる場合

ドメインモデルを無理に導入すると、
「概念だけ複雑で実装が追いつかない」といった状態にもなり得る。

✅ 歴史(系譜・親スタイル)

  • Classic Layered の発展形として登場
  • Fowler の PoEAA や Evans の DDD に大きく影響を受けたスタイル
  • のちに Hexagonal / Onion / Clean などの“依存ルール強化系”スタイルへとつながっていく

✅ 関連スタイル

  • Classic Layered:ドメインを薄く扱う原型スタイル
  • Hexagonal / Onion / Clean:ドメインをさらに強く保護しようとする発展系
  • DDD(戦術パターン):エンティティ、値オブジェクト、集約などの具体的なモデル表現

✅ 代表的なフレームワーク

Domain Model Layered はフレームワークに依存しないスタイルだが、次のような環境で採用されることが多い。

  • Spring Boot(Java)
    DDD + レイヤード構成のサンプルや書籍が非常に豊富で、Domain Model Layered の典型例として参照しやすい。

  • ASP.NET Core / .NET
    DDD と組み合わせたレイヤード構成(Application / Domain / Infrastructure)が多くのテンプレートで採用されている。

  • NestJS
    Module / Provider 構造と TypeScript の相性の良さから、ドメインモデル中心のレイヤード構成に寄せやすい。

✅ このスタイルを支えるデザインパターン

ドメインモデル(集約・エンティティ・値オブジェクト)を中心とした構造を支えるために、次のパターンがよく現れる。

  • Strategy
    ドメインオブジェクトの振る舞い(料金計算・割引・条件分岐など)を差し替え可能に表現する。

  • Composite
    階層構造を持つドメイン(ツリー状のカテゴリー、組織、構成品など)を一貫したインターフェースで扱う。

  • Mediator
    複数エンティティ間の複雑なやり取りを、一箇所に集約して調停する。

  • Template Method
    ドメインサービスや集約ルートが、似た処理の流れを持つ場合の共通化に使われる。

✅ まとめ

Domain Model Layered は、

  • レイヤードアーキテクチャの理解しやすさと、
  • DDD 的なドメインモデルの強さ

を両立しようとするスタイルである。

ドメインの複雑さが増し始めたときに、 Classic Layered からの「次の一歩」として採用を検討する価値がある。