BlazorのScopedとSingletonの違いとは?正しい使い分けを理解しよう|ASP.NET×Blazor入門 8.2
8.2 Scoped vs Singleton の違い
Blazorアプリケーションで依存性注入(DI)を活用する際に重要なのが、「ライフタイムの違い」です。 特に Scoped と Singleton は、同じように「状態を共有する」ように見えて、 実は全く異なる挙動をします。
Singleton:アプリ全体で1つのインスタンス
AddSingleton<T>() で登録されたサービスは、アプリケーションが起動してから終了するまで、 ずっと同じインスタンスが使われ続けます。つまり、全ユーザー間で共通のインスタンスになります。
これは以下のような用途に適しています:
- 設定値など、変更されない共通データ
- ログ出力など、ステートを持たないユーティリティ
Scoped:ユーザー単位のインスタンス
一方、AddScoped<T>() で登録されたサービスは、ユーザーごとにインスタンスが分かれます。 特に Blazor Server アプリでは、ユーザーごとに独立した「回線(SignalR接続)」が張られ、それぞれにスコープが作られます。
Scopedが適しているケース:
- ログイン中のユーザーの状態管理
- セッションごとのデータの保持(例:一時的なフォーム入力)
注意:Blazor WASMではScopedは「疑似Scoped」
Blazor WebAssemblyでは、サーバーとの接続が存在しないため、Scopedは内部的にTransientと同等の動きになります。 つまり、呼び出しごとに新しいインスタンスが作られます。状態を保持したい場合は、Singletonの使用を検討する必要があります。
比較まとめ
| ライフタイム | インスタンスの範囲 | 用途の例 |
|---|---|---|
| Singleton | 全アプリで1つ | 設定情報、ログユーティリティ |
| Scoped | ユーザー単位(Blazor Server) | ユーザーの状態、セッション管理 |
| Transient | 呼び出しごと | 一時的な計算・処理 |
次のセクションでは、実際に 状態管理サービスをどう設計するか を見ていきます。 8.3「状態管理サービスの設計例」へと進んでみましょう。
2025-05-05
下田 昌平
開発に関するインプットをアウトプットしています。Categories
Search Logs
Blazor JSON表示 284
HTMLとC 279
Blazor 自動化 272
Blazor テスト 268
Blazor API連携 267
Blazor 運用 267
Blazor リスト表示 264
Blazor 初期処理 264
API呼び出し Blazor 263
Blazor エラー処理 263
Blazor データ取得 263
Blazor サーバー通信 262
Blazor 非同期処理 260
Blazor コンポーネント初期化 259
使い分け 259
.NET HttpClient 使い方 258
フォーム入力 258
Blazor 非同期通信 257
HttpClient 使い方 257
Razor入門 257
入門 254
bUnit使い方 247
Blazor入門 245
依存性注入 243
HttpClient 例外処理 238
UI操作 237
Python入門 232
フォルダ構成 225
AIとPython 220
Pythonとは 213