導入
アプリが大きくなると、「呼び出す側」と「処理する側」が直接依存し合って絡まります。MediatRは間に**仲介役(Mediator)**を置き、Send(リクエスト)だけで対応する処理(ハンドラ)に届ける仕組みです。Mediatorパターンの実装で、CQRS(コマンドとクエリの分離)でよく使われます。
図解
flowchart LR
CALLER["呼び出し側<br/>mediator.Send(new GetUser(1))"] --> MED["MediatR<br/>(仲介役)"]
MED -->|対応するハンドラへ振り分け| HANDLER["GetUserHandler<br/>Handle(...)"]
HANDLER -->|結果| CALLER
進め方
- スターター
122-mediatr/starter.zipを展開し、MediatRLesson.slnを開く(MediatR導入済み・DI登録済み) GetUserリクエストとGetUserHandlerのTODOを埋めるSendで結果が返ることを確認する
学ぶこと
using MediatR;
// 1) リクエスト(何が欲しいか)。IRequest<戻り値の型>
public record GetUser(int Id) : IRequest<string>;
// 2) そのリクエストを処理するハンドラ
public class GetUserHandler : IRequestHandler<GetUser, string>
{
public Task<string> Handle(GetUser request, CancellationToken ct)
=> Task.FromResult($"User{request.Id}");
}
// 3) 呼び出し側は Send するだけ(ハンドラの実体は知らない)
string name = await mediator.Send(new GetUser(1)); // "User1"
IRequest<T>が「依頼書」、IRequestHandler<TRequest, T>が「処理係」、Sendが「仲介役に渡す」- 呼び出し側とハンドラが直接依存しないので、機能追加が既存コードに波及しにくい
- コマンド(変更)とクエリ(取得)を別リクエストに分けるCQRSと相性が良い
- DI・Mediatorパターンの実務的な実装(ライセンス条件は導入前に確認する)
期待される出力
User1
まとめ
- MediatRは
IRequest/IRequestHandler/Sendで呼び出しと処理を疎結合につなぐ - 呼ぶ側はハンドラの実体を知らずに済み、拡張に強い
- CQRSやクリーンアーキテクチャの実装で定番
次回: 数字や日付を人間に優しく整形するHumanizerです。
テンプレート構成(教材制作用メモ)
122-mediatr/
├── starter.zip # MediatR + DI登録済み / Program.cs(TODO入り)
└── solution/