本文へスキップ
BecomeCoder

C#実践コース · 第6章 代表的なNuGetパッケージとその使い方 · レッスン38

MediatR ― リクエストと処理を仲介する(ローカル実施)

ローカル実施

導入

アプリが大きくなると、「呼び出す側」と「処理する側」が直接依存し合って絡まります。MediatRは間に**仲介役(Mediator)**を置き、Send(リクエスト)だけで対応する処理(ハンドラ)に届ける仕組みです。Mediatorパターンの実装で、CQRS(コマンドとクエリの分離)でよく使われます。

図解

flowchart LR
    CALLER["呼び出し側<br/>mediator.Send(new GetUser(1))"] --> MED["MediatR<br/>(仲介役)"]
    MED -->|対応するハンドラへ振り分け| HANDLER["GetUserHandler<br/>Handle(...)"]
    HANDLER -->|結果| CALLER

進め方

  1. スターター122-mediatr/starter.zipを展開し、MediatRLesson.slnを開く(MediatR導入済み・DI登録済み)
  2. GetUserリクエストとGetUserHandlerのTODOを埋める
  3. Sendで結果が返ることを確認する
Visual StudioでMediatRを実行し、GetUserリクエストが対応ハンドラで処理され結果が表示された様子
呼び出し側はハンドラの実体を知らずに、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/