C# ASP.NET CoreでDIコンテナに登録したサービスのライフタイム(生存期間)を指定する方法
ASP.NET Coreに組み込まれているIoCコンテナ(依存性注入コンテナ)は、登録されたサービスタイプのライフタイム(生存期間)を自動的に管理します。開発者が指定したライフタイムに基づいて、サービスのインスタンスが適切なタイミングで自動的に破棄されるため、リソース管理の手間を大幅に軽減できます。
組み込みのIoCコンテナでは、次の3種類のライフタイムがサポートされています。
3種類のライフタイム
Singleton(シングルトン)
IoCコンテナは、アプリケーションの起動から終了までの全期間を通じて、サービスの単一のインスタンスを作成し、それを共有します。すべてのリクエストやクラスで同じインスタンスが使われるため、ステートレスなサービスやキャッシュ用途に適しています。
Transient(トランジェント)
サービスが要求されるたびに、IoCコンテナは指定されたサービスタイプの新しいインスタンスを作成します。毎回独立したインスタンスが必要な軽量なサービスに向いています。
Scoped(スコープド)
IoCコンテナは、HTTPリクエストごとに1回だけインスタンスを作成し、その同一リクエスト内でのみ共有されます。Webアプリケーションでは、1リクエスト内で同じDBコンテキストなどを共有したい場合によく使用されます。
実装例:インターフェースと実装クラスの定義
public interface ILog{
void info(string str);
}
class MyConsoleLogger : ILog{
public void info(string str){
Console.WriteLine(str);
}
}ServiceDescriptorを使った登録方法
まず、ServiceDescriptorを直接使用してライフタイムを指定する方法を見てみましょう。
public class Startup{
public void ConfigureServices(IServiceCollection services){
services.Add(new ServiceDescriptor(typeof(ILog), new
MyConsoleLogger())); // シングルトンとして登録
services.Add(new ServiceDescriptor(typeof(ILog),
typeof(MyConsoleLogger), ServiceLifetime.Transient)); // トランジェントとして登録
services.Add(new ServiceDescriptor(typeof(ILog),
typeof(MyConsoleLogger), ServiceLifetime.Scoped)); // スコープドとして登録
}
}拡張メソッドを使った登録方法(推奨)
実際の開発では、より簡潔に記述できる拡張メソッドを使うのが一般的です。以下の例は、各ライフタイムに対応する拡張メソッドでサービスを登録するさまざまな方法を示しています。
public class Startup{
public void ConfigureServices(IServiceCollection services){
// シングルトンとして登録
services.AddSingleton<ILog, MyConsoleLogger>();
services.AddSingleton(typeof(ILog), typeof(MyConsoleLogger));
// トランジェントとして登録
services.AddTransient<ILog, MyConsoleLogger>();
services.AddTransient(typeof(ILog), typeof(MyConsoleLogger));
// スコープドとして登録
services.AddScoped<ILog, MyConsoleLogger>();
services.AddScoped(typeof(ILog), typeof(MyConsoleLogger));
}
}このように、ジェネリック版とTypeを引数に取る版の両方が用意されているため、プロジェクトのコーディングスタイルに合わせて柔軟に選択できます。用途に応じて適切なライフタイムを選ぶことで、パフォーマンスとメモリ効率のバランスの取れたアプリケーションを構築できます。
-
C# ASP.NET Web APIでアクションメソッドにエイリアス名を設定する方法
アクションメソッドとはASP.NET Web APIでは、コントローラー内のpublicメソッドは「アクションメソッド」と呼ばれます。ここでは、ApiControllerクラスから派生したDemoControllerに、Get・Post・Put・DeleteといったHTTP動詞に対応する名前を持つ複数のアクションメソッドが定義されている例を考えてみましょう。基本的なアクションメソッドの定義例public class DemoController : ApiController{ public IHttpActionResult Get(){ // 何らかの処理
-
C# ASP.NET WebAPIでCORSの問題を解決する方法を徹底解説
CORS(クロスオリジンリソースシェアリング)とはクロスオリジンリソースシェアリング(Cross-Origin Resource Sharing:CORS)は、追加のHTTPヘッダーを使用して、あるオリジンで動作しているWebアプリケーションに対し、別のオリジンにある選択されたリソースへのアクセスを許可するようブラウザに指示する仕組みです。Webアプリケーションは、自身とは異なるオリジン(ドメイン、プロトコル、ポート)のリソースを要求する際に、クロスオリジンHTTPリクエストを実行します。例として、フロントエンド(UI)とバックエンド(サービス)を持つアプリケーションを考えてみましょう。フロン