C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C# / ASP.NET Core】AddSingleton・AddScoped・AddTransientの違いを徹底解説


ASP.NET Coreでは、Startup.cs(.NET 6以降ではProgram.cs)に依存関係(DIサービス)を登録する方法が3つあります。それが「AddSingleton」「AddScoped」「AddTransient」です。

これらはいずれも依存性注入(Dependency Injection)のためのメソッドですが、インスタンスの生存期間(ライフタイム)がそれぞれ異なります。適切に使い分けることで、アプリケーションのパフォーマンスや安定性に大きな影響を与えます。

AddSingleton(シングルトン)とは

型をシングルトンとして登録すると、アプリケーション全体でただ1つのインスタンスが共有されます。すべてのリクエスト、すべてのユーザーに対して同じインスタンスが使用されるため、静的オブジェクトを持つのに近いイメージです。

インスタンスは最初のリクエスト時に生成され、以降はアプリケーションがシャットダウンするまで同じインスタンスが再利用され続けます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ILog, Logger>();
}

AddScoped(スコープ)とは

型をスコープとして登録すると、1つのHTTPリクエストごとに1つのインスタンスが生成されます。同じリクエスト内であれば同じインスタンスが共有され、新しいリクエストが来るたびに新しいインスタンスが作られます。

リクエスト単位で状態を管理したい場合に適しており、Entity Framework CoreのDbContextなどでよく使われるライフタイムです。

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ILog, Logger>();
}

AddTransient(トランジェント)とは

型をトランジェントとして登録すると、解決されるたびに毎回新しいインスタンスが生成されます。サービスやコントローラーごと、リクエストごと、ユーザーごとに、常にまったく新しいインスタンスが作られます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<ILog, Logger>();
}

3つのライフタイム比較表

項目AddSingletonAddScopedAddTransient
インスタンス 全リクエスト・全ユーザーで同一 リクエストごとに1つ 毎回異なる
破棄タイミング アプリケーションのシャットダウン時 リクエスト終了時 リクエスト終了時
主な用途 シングルトン実装が必要な場合(設定情報、キャッシュなど) ユーザーやリクエストごとに異なる動作が必要な場合 軽量でステートレスなサービス

  1. ASP.NET MVC C#におけるNonAction属性(NonActionAttribute)の重要性とは?

    NonAction 属性は、コントローラー内にパブリックメソッドを定義したいものの、それをアクションメソッドとして扱いたくない場合に使用します。アクションメソッドとは、URLを使って呼び出すことができるコントローラー内のパブリックメソッドのことです。そのため、デフォルトではコントローラー内に定義されたすべてのパブリックメソッドは、URLリクエスト経由で呼び出し可能な状態になっています。コントローラー内のパブリックメソッドへのアクセスを制限したい場合は、NonAction属性を利用することで実現できます。ここで、MyMethod1 と MyMethod2 という2つのパブリックメソッドを持つ H

  2. C# ASP.NET Web APIのフィルターの種類と使い方を徹底解説

    ASP.NET Web APIフレームワークでは、リクエスト処理のさまざまな段階に追加のロジックを組み込むために「フィルター」が使用されます。フィルターは、ロギング、認可、キャッシュといった横断的関心事(クロスカッティングコンサーン)を実装するための仕組みであり、アクションメソッドやコントローラーに対して、宣言的またはプログラム的に適用できます。ここでは、C#のWeb APIで利用できる主なフィルターの種類について詳しく見ていきましょう。Web APIの主なフィルターの種類1. 認証フィルター(Authentication Filter)認証フィルターは、ユーザーの身元情報を検証するために使用