質問: ASP.Net MVC + Autofac + EF6を使用します。 DbContextはUnitOfWorkによってラップされます。 Autofacを介して、httpリクエストごとに作成します。また、UnitOfWorkコンストラクターでhttpリクエスト全体のトランザクションを開きます。 問題は、すべてのhttp要求をトランザクションにラップする必要がないことです。それらのいくつかは、DBへのリクエストを持っていません。 DBへの最初の実際のリクエストまで、トランザクションのオープンを遅延させたいと考えています。どのようにそれを行うことができますか? SaveChagesをオーバーライドし、保存前にトランザクションを開くことができますが、選択クエリはこの方法ではトランザクションで実行されません。 ここでもう1つ問題があります。ソフトリムーバブルエンティティにはEF Plusのグローバルフィルターを使用します。うまくいきますが、コンテキストのフィルターの初期化はかなり遅いです。 DBへの最初の実際のリクエストまでそれを遅らせたいと思います。
回答: 問題は、アクションが呼び出されるにもかかわらず`UnitOfWork`がコントローラーに注入されるため、使用する必要がない場合でも、コンストラクターが常に呼び出されることです。 1つの解決策は、Autofac 遅延インジェクションを使用することです。この場合、 `UnitOfWork`のコンストラクターは、そのインスタンスが必要な場合にのみ呼び出されます ``` public class SomeController : Controller { //.. private readonly Lazy _unitOfWork; private IAnotherService UnitOfWork => _unitOfWork.Value; public SomeController( //.. Lazy unitOfWork ) { //.. _unitOfWork = unitOfWork; } //.. public ActionResult ActionNeedsTransaction() { //use UnitOfWork UnitOfWork.SaveChanges(); return Json(value); } } ```