背景
PR #87 (StudentId実装) にて、RegisterMemberInput.studentId を string のままにするか StudentId 型にするかの議論が発生。
現在のコードベースでは、ユースケースのInputはプリミティブ型を受け取り、ユースケース内でドメイン型に変換している:
// 現状: RegisterMemberInput
studentId: string;
department: string;
email: string;
// ユースケース内で変換
StudentId.fromString(input.studentId)
Department.fromString(input.department)
new UniversityEmail(input.email)
論点
RegisterMemberInput 等のInput DTOは何層に属するか?
このプロジェクト固有の文脈
@shizuoka-its/core はnpmパッケージとして公開されている
- Executableは余暇のTSコードから直接呼ぶインターフェースを想定
- 現状、明示的なInterface/Adapter層は存在しない(ユースケースが公開APIを兼ねている)
決定すべきこと
- Input DTOの層的な位置づけ(境界DTO vs Application層内部契約)
- 上記を踏まえた型の方針(プリミティブ vs ドメイン型)
- 方針変更する場合、全Input DTOに一貫して適用する
参考
- Eric Evans: Application ServiceはDTOとドメインオブジェクトの変換を担う
- Vaughn Vernon (IDDD): Commandはシンプルなデータコンテナ
- Robert C. Martin (Clean Architecture): 境界を越えるデータはシンプルなデータ構造であるべき
- Vladimir Khorikov: Commandにはプリミティブのみ、変換はHandler内で
背景
PR #87 (StudentId実装) にて、
RegisterMemberInput.studentIdをstringのままにするかStudentId型にするかの議論が発生。現在のコードベースでは、ユースケースのInputはプリミティブ型を受け取り、ユースケース内でドメイン型に変換している:
論点
RegisterMemberInput等のInput DTOは何層に属するか?CQRSのCommand(境界のDTO) として見るなら、プリミティブ型が妥当
Application層の内部契約 として見るなら、ドメイン型も選択肢に入る
このプロジェクト固有の文脈
@shizuoka-its/coreはnpmパッケージとして公開されている決定すべきこと
参考