Application Service interface
DDDでの位置づけ
Application Serviceのinterfaceは、DDDで必ず作るものではありません。
このガイドラインでは、APIが何を呼び出せるか、何を渡し、何が返るかを、実装を読まなくても分かるようにするため、interfaceを作ります。
interfaceで決めること
interfaceには、呼び出せるメソッド、そのメソッドへ渡す情報、処理後に返す結果を定義します。処理の内容は書きません。
参加申請では、IRequestParticipationApplicationServiceを呼び出し口にします。
コードで表す
// RequestParticipationCommand.ts
export type RequestParticipationCommand = {
readonly recruitmentId: string; // 参加したい募集のID
readonly participantId: string; // 参加を申請する人のID
readonly requestedAt: Date; // 参加を申請した日時
};
// IRequestParticipationApplicationService.ts
import type { RequestParticipationCommand } from
"./RequestParticipationCommand";
// 参加申請ユースケースの呼び出し口
export interface IRequestParticipationApplicationService {
// 参加申請を実行する
execute(command: RequestParticipationCommand): Promise<void>;
}execute()へ渡す情報はRequestParticipationCommandで決めています。返却値はPromise<void>なので、この例では処理結果のデータを返しません。Commandの詳しい説明は「DDD実践リファレンス」で行います。
Application Serviceが実装する
RequestParticipationApplicationServiceは、IRequestParticipationApplicationServiceで決めたexecute()を実装します。
import type {
IRequestParticipationApplicationService,
} from "./IRequestParticipationApplicationService";
import type { RequestParticipationCommand } from
"./RequestParticipationCommand";
export class RequestParticipationApplicationService
implements IRequestParticipationApplicationService {
async execute(command: RequestParticipationCommand): Promise<void> {
// 参加申請ユースケースの処理
}
}interfaceを通して呼び出す
APIは、実装クラスではなくIRequestParticipationApplicationServiceを受け取り、execute()を呼び出します。
// APIがinterfaceとしてApplication Serviceを受け取る
async function handleRequest(
applicationService: IRequestParticipationApplicationService,
): Promise<void> {
const command: RequestParticipationCommand = {
recruitmentId,
participantId: signedInUser.id,
requestedAt: new Date(),
};
await applicationService.execute(command);
}APIは、参加申請がどのクラスで実装されているかを意識せず、interfaceで決めた呼び出し方だけを使います。
ディレクトリで表す
src/features/futsal/
└── application/
├── RequestParticipationCommand.ts ← Command
├── IRequestParticipationApplicationService.ts ← interface
└── RequestParticipationApplicationService.ts ← 実装このガイドラインでは、interfaceの先頭にIを付けます。実装クラスにはIを付けず、ファイル名だけで役割を見分けられるようにします。