私はASP.NET Coreとその組み込みDIコンテナを使用しています。私は変更できないサードパーティライブラリ(NLog)を使用しています。IServiceProviderをキャッシュしてアプリの生存期間を確保するのは安全ですか?
私のFoo
クラスには(コンストラクタインジェクションによって)依存関係があります。ライブラリが(それは私のコントロール外です)アプリの期間Foo
インスタンスをキャッシュしかし
public class Foo {
private readonly IMyContext _context;
public Foo(IMyContext context) { _context = context; }
// etc.
}
。つまり、依存関係もキャッシュされます。そして、その依存関係は、スコープされるべきEFコンテキストであるため、キャッシュされてはなりません。
代わりにIServiceProvider
を注入してからインスタンスを作成することもできます。
public class Foo {
private readonly IServiceProvider _sp;
public Foo(IServiceProvider sp) { _sp = sp; }
// etc.
public void bar() {
var context = _sp.GetService<IMyContext>();
// use it
}
}
しかし、以前のように、そのIServiceProvider
インスタンスは、アプリケーションの寿命のためにキャッシュされるだろう。
「安全」ですか?私が知っておくべき悪影響はありますか?
これは素晴らしいです。私はそれを実装しましたが、動作させることができませんでした。組み込みのDIコンテナ[デリゲートをサポートしていません](http://stackoverflow.com/questions/35736070/how-to-use-funct-in-built-in-dependency-injection)をこのようにします。どのように不幸な、この答えは素晴らしいだろう。これは一般的なケースでは優れていますが、私にとってはうまくいきません。私は答えとしてマークするかどうかにかかわらず、他の人が私の環境のアドバイスを持っているかもしれないので、私は矛盾しています – grokky
@grokky問題はありません。それはAutofacで動作します。例えば、それがオプションかどうかはわかりません。あなたは答えとしてマークする必要はありません、おそらく他の誰かが考えを持っています。 – CodeCaster
工場を注入するのは解決策ですが、依存関係が 'IDisposable'かどうかは必ずしも分かりません。なぜなら、* Autofac *は' Owned 'を導入しているからです(私の知る限り、ネットフレームワーク :()。そのような場合、私のサービスはしばしば 'Func >' –