ドメイン層の実装

architecture

  • 基本「関心の分離」と「依存性の整理」に帰着する

テラソルーナガイドライン
いわゆる「モデル」をEntityと言っている?

  • Entityの実装
    • 基本テーブル毎, 中間テーブルのEntityは作らない
    • FKはEntity又はEntityのList, Setで表す
    • カテゴリカルデータはEntityではなく String 等の基本型で表してEnumにすべき
  • Repositoryの実装
    • Entityのライフサイクルを制御(CRUD), 永続化する操作
      • 実際のAPIはinfra層のRepositoryImplで実装, infraに依存してはいけない
    • CRUD以外にも findOneBy, findAllBy, findPageBy, countBy, existsBy が必要になるかも
  • Serviceの実装
    • ビジネスロジックを書く, 間違った共通化が行われないように再利用性は考慮しない
      • 特定のControllerに対するビジネスロジックの提供が目的
    • 他サービスから呼び出すのは原則禁止, そうしたいなら SharedService にすべき
    • 複数Controllerから呼ばれるがそれによる分岐が入る場合は分岐を別サービスに分けて共通処理は SharedService
      • 依存が不正になるので
    • データはRepositoryを介してEntityとして取得

開発の流れ

  • 共通設計: Entity作成
  • 共通設計: 汎用Repository interface作成
  • 開発: 汎用Repository実装, 特化Repository interface作成
  • 開発: 特化Repository interface作成, Service作成, 実装

ControllerとServiceの責任分界点について

  • 単一, 相関validationはControllerですべき
    • ex. Bean Validation
  • modelへの変換, modelからの変換はControllerですべき
    • やはりそう, 指摘したが
    • DDD の文脈では, 外部オブジェクトとの変換はDTOに任せるべき
  • トランザクション境界はServiceに設ける

注意

Q: domainにinfraが混入することを100%防げるのか? -> A: 出来ない

  • ex. tx, 一貫性チェック?
  • 責務を分離して専念させるのが目的

Application Serviceと Domain Serviceについて

DDD の文脈だと区別する todo

SharedServiceについて

  • SharedService はトランザクション境界にならない事が多そう

Service層にAtomic Designの考え方適用できないかなー

ServiceとSharedServiceの階層の話を一般化する話?

Util

  • DBアクセス無ければ Util

参考文献