はい、DbContext
のデフォルトの有効期間が有効です。これは、このように意図されています。
DbContext
をインスタンシエートするのはかなり安く、多くのリソースを使用しないようにします。シングルトンの有効期間がDbContext
の場合は、特にトラッキングを無効にしない限り、一度読み取ったすべてのレコードはDbContext
で追跡されます。これははるかに多くのメモリ使用量を必要とし、それは成長し続けるでしょう。
さらに、DbContext
トラックのパフォーマンスが低下します。そのため、DbContext
はusing(var context = new AppDbContext())
ブロック内でのみ使用されることがよくあります。
ウェブアプリケーションでは、frameworkで管理されているので、using
ブロックを使用すると問題があります。それを先に処理すると例外が発生して失敗します。
もう一方の側で一時的な有効期間を使用すると、「トランザクション」機能が失われます。スコープ付きの場合、DbContext
には要求と同じ長さのトランザクションスコープがあります。
細かい制御が必要な場合は、作業単位パターン(DbContext
が既に利用されています)を使用する必要があります。あなたの2番目の質問については
:
サービスを作成する場合は、スコープの1またはそれより短い(:スコープまたは一時を読む)に等しいのです寿命を持っている必要があります。
サービスの寿命を明示的に指定する必要がある場合は、DbContext
ファクトリサービスまたはファクトリメソッドをサービスに追加する必要があります。
あなたは
services.AddTransient<Func<AppDbContext>>((provider) => new Func<MyDbContext>(() => new AppDbContext()));
services.AddSingleton<IMySingletonService, MySingletonService>();
のようなものでこれを達成することができ、あなたのサービスは、次のようになります。
public class MySingletonService : IMySingletonService, IDisposable
{
private readonly AppDbContext context;
public MySingletonService(Func<AppDbContext> 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();
}
}
それは本当に寿命を管理するコントローラのですか?または要求の終わりにリクエストごとにスコープされたものを廃棄するDIですか?私はそれをよりよく理解したいと思います –
私の悪いです。私はフレームワークを言うことを意味しました。コントローラファクトリ( 'IControllerFactory'、デフォルト実装のためのhttps://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/Controllers/DefaultControllerFactory.csを参照してください)の' CreateController 'メソッドを呼び出すと、コントローラを作成して処分し、それを破棄し、' ReleaseController() 'メソッドに依存します。内部の動作の詳細とその動作については、このGitHubの問題も参照してください:https://github.com/aspnet/Mvc/issues/3727 – Tseng
ありがとう。コンストラクタ内でDbContextをとるリポジトリがあり、IDisposableを実装すると、それ自体のdisposeメソッドからDbContextでdisposeを呼び出すはずですか?私はアイデンティティのEF UserStoreがdbcontextのdisposeを呼び出さないことに気付きましたが、それは私には間違っていると感じていませんでした。なぜ彼らがなぜそうしたのか理解しようとしていません。 –