2017-07-03 9 views
3

を注入しますその生涯を適切に管理する。私はFooServiceのメンバーの一人の内側にこれを行うと:は、私はこの作業のようなものを取得しようとしている工場ASP.NETコアDIとのFunc

System.ObjectDisposedException:破棄されたオブジェクトにアクセスできません

using (var bar = _barFactory()) 
{ 
    ... 
} 

私はObjectDispoedExceptionを取得します。このエラーの一般的な原因は、依存性注入から解決されたコンテキストを破棄し、後でアプリケーションの別の場所で同じコンテキストインスタンスを使用しようとすることです。これは、コンテキストでDispose()を呼び出す場合、またはusingステートメントでコンテキストをラップする場合に発生する可能性があります。依存性注入を使用している場合は、依存性注入コンテナがコンテキストインスタンスを処理するようにする必要があります。

ただし、usingステートメントを使用しないでvar bar = _barFactory();を実行すると、DIコンテナにそのインスタンスで完了したことを通知する方法がなくなり、処分できます。

ここで正しいアプローチは何ですか?


(サイドノート:はい、私はいくつかは、シングルトンサービスが一時サービスに依存すべきではない、そのオブジェクトになることを知っていることがここで何が起こっているかではありません。シングルトンサービスはシングルトン工場に依存しています、。それは一時的なインスタンスを生成しシングルトンは、1つのまたは2文の過渡サービスを使用し、それで行われているので、ここでは実際の寿命に問題があってはならない)

答えて

2

documentationで説明したように:。。

コンテナは、それが作成するIDisposableタイプに対してDisposeを呼び出します。ただし、コンテナにインスタンスを追加すると、そのインスタンスは破棄されません。

usingステートメントを使用しないでください。すべてがOKである必要があります。

+0

しかし、*いつ*は* Disposeを呼び出しますか?私はインスタンスで完了したことをどのように知っていますか? –

+1

@TomasLyckenコンテナは 'List 'を持ち、スコープの終わりに 'Transient'と' Scoped'オブジェクトを配置します(デフォルトのASP.NETコアスコープはWebリクエストです)。 https://stackoverflow.com/a/40845639/5112433 –

関連する問題