.NET Core のコンソールアプリケーションにおいて、DI オブジェクトのインスタンス(ライフタイム)がどのように扱われるかわからなかったのでちょっと調べてみました。
あまりよく分かっていないので、間違いなどがあるかもしれません。
DI サービスへの登録
DI サービスへオブジェクトを登録するメソッドは以下の3つがあります。
メソッド | 内容 |
---|---|
AddTransient() |
インジェクション毎にインスタンスを生成 |
AddScoped() |
リクエスト毎にインスタンスを生成 |
AddSingleton() |
アプリケーション内で1つのインスタンスを生成 |
このうち、AddTransient()
と AddSingleton()
は分かりやすく、ASP.NET Core による Web アプリケーションの場合と、.NET Core によるコンソールアプリケーションの場合でも同じ動作をします。
AddScoped の場合は?
ASP.NET Core の場合
AddScoped()
の場合、リクエスト毎にインスタンスが作成されるとあるので、1つの HTTP リクエスト内で行われる処理において同一のインスタンスとして扱われるようです。
従って、1つのリクエスト内で複数のクラスの処理を跨ってインスタンスが維持される必要がある場合に使用することになります。
.NET Core コンソールアプリケーションの場合は?
コンソールアプリケーションにはリクエストという概念がありません。
調べてみると、どうやら自分でスコープを作成することで、その範囲内で同一のインスタンスを扱えるようになるようです。
なので、特にスコープを作成しなかった場合、AddScoped()
と AddSingleton()
は同じように動作するようです。