書籍「ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本」で紹介されている、DDD+レイヤードアーキテクチャの実装サンプル itddd/Layered のデータフローを図に起こしたので以下に記載する。
ユーザー新規登録時のデータフロー
- Controller、ApplicationService, Repositoryでデータの詰め替えが行われている。(※ちなみにユーザー取得でContollerにUser情報を返却する場合は、Chapter6で登場するDTOのUserDataに詰めてからUserGetResultに乗せて返却している。)
- エンティティのUserはFactory経由で生成している。
以下、書籍と読み合わせるためにChapterとクラスの記載箇所を列挙する。
ドメインオブジェクト(Chapter 2, 3)
- SnsDomain/Users/User(エンティティ)
- SnsDomain/Users/UserId(値オブジェクト)
- SnsDomain/Users/UserName(値オブジェクト)
ドメインサービス(Chapter4)
値オブジェクトやエンティティに実装すると違和感があるふるまい(重複ユーザの確認など)を定義する。状態を持たない。
- SnsDomain/Services/UserService
リポジトリ(Chapter 5)
責務はドメインオブジェクトの永続化や再構築。
- SnsDomain/Models/Users/IUserRepository
- EFInfrastructure/Persistence/Users/EFUserRepository(5.7 ORMのEntityFrameworkによる実装)
アプリケーションサービス, DTO, コマンドオブジェクト(Chapter 6)
SnsApplication/Users/UserApplicationService
ドメインオブジェクトを強調させてユースケースを実現するオブジェクト。ドメインのルールは記述されるべきではない。状態を持たない。
SnsApplication/Users/Commons/UserData
ドメインオブジェクトをDTO(Data Transfer Object)にデータを移し替えて返却する。
(ドメインオブジェクトを外部に公開すると以下のデメリットがあるため)
- ドメインオブジェクトの振る舞いがアプリケーションサービス以外で呼び出され、アプリケーションとして提供すべきコードが各所に散らばる
- ドメインオブジェクトに対する多くの依存が発生し、ドメイン変更時の影響範囲が大きくなる
SnsApplication/Users/Update/UserUpdateCommand
仕様変更時にアプリケーションサービスのメソッドのシグネチャが影響を受けないように、コマンドオブジェクトとして定義する
DI Container(Chapter 7)
依存関係のコントロール。itddd ではC#のServiceCollectionを利用。
- WebApplication/Config/Dependency/EFDependencySetup
- WebApplication/Config/Dependency/InMemoryModuleDependencySetup
- WebApplication/Config/Dependency/SqlConnectionDependencySetup
MVCフレームワーク(Chapter 8)
- WebApplication/Startup
- WebApplication/appsettings.json
WebApplication/Controllers/UserController
利用者からの入力データ(Httpリクエスト)をアプリケーションに伝えるための変換を行っている。
WebApplication/Models/Users/Post/UserPostRequestModel
ビューから受け渡されるデータがバインドされるオブジェクト。
UserRegisterCommandと類似するデータ構造だが、用途が違うので使い回さない。