1. ホーム
  2. dependency-injection

[解決済み] .NET Coreの依存性注入インスタンスはいつディスポーザブルになりますか?

2023-07-19 10:11:03

質問

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) メソッドの外部でアクセスできるようにするために何かおかしなことをしない限り、利用できません (いずれにせよ、してはいけないことですが)。

もちろん、特に多くのリソースを消費している場合は、できるだけ早く一時的なサービスを解放することが推奨されます。