質問: ASP.NET Coreアプリケーションでは、このようにDIを介してDbContextを登録できます ``` services.AddDbContext(options => options.UseNpgsql(connection)); ``` そして、それはその生涯が何であるかを知ることに悩まされていますか? ここからはからScopedとして設定されているように見えます。つまり、要求ごとにDbContextインスタンスが作成されます。 質問の最初の部分は次のとおりです。それは本当ですか?はいの場合は、どれくらいの費用がかかりますか? もう1つは、DbContextを消費し、コントローラによって消費されることを意図したサービスを作成し、DBの一部のエンティティを管理するAPIを持つサービスをScopedとして登録する必要があるかどうかです。
回答: はい、 `DbContext`デフォルトの有効`DbContext`が有効です。これは、このように意図されています。 `DbContext`インスタンス`DbContext`はかなり安く、多くのリソースを使用しないようにします。シングルトンの有効期間を持つ`DbContext`を使用する場合は、追跡を特に無効にしない限り、一度読み取ったすべてのレコードは`DbContext`によって追跡されます。これははるかに多くのメモリ使用量を必要とし、それは成長し続けるでしょう。 また、 `DbContext`トラックが多いほど、パフォーマンスは低下します。そのため、 `DbContext`は`DbContext` `using(var context = new AppDbContext())`ブロック内でのみ使用されることがよくあります。 Webアプリケーションではしかし、使用して`using`寿命がによって管理されているため、ブロックすることは、悪いフレームワークとあなたがそれを処分する場合は、早期その後の呼び出しが例外で失敗しますし。 反対側で一時的な有効期間を使用すると、 "トランザクション"機能が失われます。スコープ付きでは、 `DbContext`は要求と同じ長さのトランザクションスコープがあります。 詳細な制御が必要な場合は、Unit of Workパターン( `DbContext`すでに利用されています)を使用する必要があります。 あなたの2番目の質問: サービスを作成する場合は、スコープの長さと等しいかそれより短いライフタイム(読み取り:スコープまたは一時)を持つ必要があります。 明示的にサービスの`DbContext`期間を延長する必要がある場合は、サービスに`DbContext`ファクトリサービスまたはファクトリメソッドを挿入する必要があります。 これは次のようなもので実現できます ``` services.AddTransient>( (provider) => new Func( () => new AppDbContext())); services.AddSingleton(); ``` あなたのサービスは次のようになります。 ``` public class MySingletonService : IMySingletonService, IDisposable { private readonly AppDbContext context; public MySingletonService(Func contextFactory) { if(contextFactory == null) throw new ArgumentNullException(nameof(contextFactory)); // it creates an transient factory, make sure to dispose it in `Dispose()` method. // Since it's member of the MySingletonService, it's lifetime // is effectively bound to it. context = contextFactory(); } } ```