ドメイン層の実装
- 基本「関心の分離」と「依存性の整理」に帰着する
テラソルーナガイドライン
いわゆる「モデル」をEntityと言っている?
- Entityの実装
- 基本テーブル毎, 中間テーブルのEntityは作らない
- FKはEntity又はEntityのList, Setで表す
- カテゴリカルデータはEntityではなく
String等の基本型で表してEnumにすべき
- Repositoryの実装
- Entityのライフサイクルを制御(CRUD), 永続化する操作
- 実際のAPIはinfra層のRepositoryImplで実装, infraに依存してはいけない
- CRUD以外にも
findOneBy,findAllBy,findPageBy,countBy,existsByが必要になるかも
- Entityのライフサイクルを制御(CRUD), 永続化する操作
- Serviceの実装
- ビジネスロジックを書く, 間違った共通化が行われないように再利用性は考慮しない
- 特定のControllerに対するビジネスロジックの提供が目的
- 他サービスから呼び出すのは原則禁止, そうしたいなら
SharedServiceにすべき - 複数Controllerから呼ばれるがそれによる分岐が入る場合は分岐を別サービスに分けて共通処理は
SharedServiceに- 依存が不正になるので
- データはRepositoryを介してEntityとして取得
- ビジネスロジックを書く, 間違った共通化が行われないように再利用性は考慮しない
開発の流れ
- 共通設計: Entity作成
- 共通設計: 汎用Repository interface作成
- 開発: 汎用Repository実装, 特化Repository interface作成
- 開発: 特化Repository interface作成, Service作成, 実装
ControllerとServiceの責任分界点について
- 単一, 相関validationはControllerですべき
- ex.
Bean Validation
- ex.
- modelへの変換, modelからの変換はControllerですべき
- やはりそう, 指摘したが
- DDD の文脈では, 外部オブジェクトとの変換はDTOに任せるべき
- トランザクション境界はServiceに設ける
注意
Q: domainにinfraが混入することを100%防げるのか? -> A: 出来ない
- ex. tx, 一貫性チェック?
- 責務を分離して専念させるのが目的
Application Serviceと Domain Serviceについて
SharedServiceについて
SharedServiceはトランザクション境界にならない事が多そう
Service層にAtomic Designの考え方適用できないかなー
ServiceとSharedServiceの階層の話を一般化する話?
Util
- DBアクセス無ければ
Util