[解決済み] .NET Coreの依存性注入インスタンスはいつディスポーザブルになりますか?
質問
ASP.NET Coreでは、拡張メソッドを
IServiceCollection
の拡張メソッドを使用して依存性注入を設定し、型が必要になったときに適切なメソッドを使用して新しいインスタンスを作成します。
-
AddTransient<T>
- は、要求されるたびに再び作成されるタイプを追加します。 -
AddScoped<T>
- は、リクエストのスコープのために保持されるタイプを追加します。 -
AddSingleton<T>
- は、最初にリクエストされたときに型を追加し、それを保持します。
を実装したタイプを持っています。
IDisposable
を実装した型があり、それらはディスポーザブルでないと問題が発生します。
Dispose
が実際に呼び出されるのはいつですか?
インスタンスが常に破棄されるようにするために、何か追加しなければならないこと(例外処理など)はありますか?
どのように解決するのですか?
解決されたオブジェクトはコンテナと同じライフタイム/ディスポーザサイクルを持ちます。
using
ステートメントまたは
.Dispose()
メソッドを使用します。
ASP.NET Coreでは、リクエストごとにインスタンス化され、リクエストの終了時に破棄されるスコープ付きコンテナが取得されます。このとき、このコンテナによって作成されたスコープ付き依存関係や一時的依存関係も破棄されます (これは、それらが
IDisposable
インターフェイスを実装している場合)、ソースコード上でも確認できます
で見ることができます。
.
public void Dispose()
{
lock (ResolvedServices)
{
if (_disposeCalled)
{
return;
}
_disposeCalled = true;
if (_transientDisposables != null)
{
foreach (var disposable in _transientDisposables)
{
disposable.Dispose();
}
_transientDisposables.Clear();
}
// PERF: We've enumerating the dictionary so that we don't allocate to enumerate.
// .Values allocates a ValueCollection on the heap, enumerating the dictionary allocates
// a struct enumerator
foreach (var entry in ResolvedServices)
{
(entry.Value as IDisposable)?.Dispose();
}
ResolvedServices.Clear();
}
}
シングルトンは親コンテナがディスポーザブルになったときにディスポーザブルになりますが、これは通常アプリケーションがシャットダウンしたときを意味します。
TL;DR
: アプリケーションの起動時にスコープ付き/トランジェントサービスをインスタンス化しない限り(
app.ApplicationServices.GetService<T>()
を使って)、サービスが正しく Disposable インターフェイスを実装している限りは、(例えば
のような) Disposable インターフェイスを正しく実装している限りは
のように)Disposableインターフェイスを正しく実装していれば、特に注意することはないでしょう。
の外では、親コンテナは利用できません。
Configure(IApplicationBuilder app)
メソッドの外部でアクセスできるようにするために何かおかしなことをしない限り、利用できません (いずれにせよ、してはいけないことですが)。
もちろん、特に多くのリソースを消費している場合は、できるだけ早く一時的なサービスを解放することが推奨されます。
関連
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み] DIコードではなく、IoCコンテナが必要な理由とは?[クローズド]
-
[解決済み] なぜ依存性注入を使用するのですか?
-
[解決済み] ConfigureServices内からASP.NET Core DIでインスタンスを解決する
-
[解決済み】HttpClientとHttpClientHandlerはリクエストの間にディスポされなければならないのでしょうか?
-
[解決済み】.NET Coreがインストールされているかどうかを判断する方法
-
[解決済み] DIコンテナを介して作成されたオブジェクトを初期化するパターンはありますか?
-
[解決済み] Ioc/DI - なぜアプリケーションのエントリポイントですべてのレイヤー/アセンブリを参照しなければならないのですか?
-
[解決済み] 制御の逆転」、「依存関係の逆転」、「デカップリング」の違いについて
-
[解決済み] 依存性注入の文脈におけるコンポジション・ルートとは何か?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Inversion of ControlとDependency Injectionの比較
-
[解決済み] DIコードではなく、IoCコンテナが必要な理由とは?[クローズド]
-
[解決済み] 依存性注入は、コンストラクタまたはプロパティ・セッタで行うのですか?
-
[解決済み] DIコンテナを介して作成されたオブジェクトを初期化するパターンはありますか?
-
[解決済み] Ioc/DI - なぜアプリケーションのエントリポイントですべてのレイヤー/アセンブリを参照しなければならないのですか?
-
[解決済み] IServiceProviderのGetRequiredServiceメソッドとGetServiceメソッドの違いは何ですか?
-
[解決済み] 制御の逆転」、「依存関係の逆転」、「デカップリング」の違いについて
-
[解決済み] IoCコンテナを使って、エンティティ/ビジネスオブジェクトの依存関係を解決しませんか?
-
[解決済み] 依存性注入の文脈におけるコンポジション・ルートとは何か?