を注入しますその生涯を適切に管理する。私はFooService
のメンバーの一人の内側にこれを行うと:は、私はこの作業のようなものを取得しようとしている工場ASP.NETコアDIとのFunc
System.ObjectDisposedException:破棄されたオブジェクトにアクセスできません
using (var bar = _barFactory()) { ... }
私は
ObjectDispoedException
を取得します。このエラーの一般的な原因は、依存性注入から解決されたコンテキストを破棄し、後でアプリケーションの別の場所で同じコンテキストインスタンスを使用しようとすることです。これは、コンテキストでDispose()を呼び出す場合、またはusingステートメントでコンテキストをラップする場合に発生する可能性があります。依存性注入を使用している場合は、依存性注入コンテナがコンテキストインスタンスを処理するようにする必要があります。
ただし、usingステートメントを使用しないでvar bar = _barFactory();
を実行すると、DIコンテナにそのインスタンスで完了したことを通知する方法がなくなり、処分できます。
ここで正しいアプローチは何ですか?
(サイドノート:はい、私はいくつかは、シングルトンサービスが一時サービスに依存すべきではない、そのオブジェクトになることを知っていることがここで何が起こっているかではありません。シングルトンサービスはシングルトン工場に依存しています、。それは一時的なインスタンスを生成しシングルトンは、1つのまたは2文の過渡サービスを使用し、それで行われているので、ここでは実際の寿命に問題があってはならない)
しかし、*いつ*は* Disposeを呼び出しますか?私はインスタンスで完了したことをどのように知っていますか? –
@TomasLyckenコンテナは 'List'を持ち、スコープの終わりに 'Transient'と' Scoped'オブジェクトを配置します(デフォルトのASP.NETコアスコープはWebリクエストです)。 https://stackoverflow.com/a/40845639/5112433 –