我們使用ASP.Net MVC + Autofac + EF6。 DbContext由UnitOfWork包裝。我們通過Autofac為每個http請求創建它。我們還在UnitOfWork構造函數中為整個http請求打開事務。
問題在於,並非所有http請求都必須包裝在事務中。其中一些甚至沒有向數據庫的請求。
我們希望將事務打開延遲到對DB的第一個實際請求。有什麼想法可以做到嗎?
我們可以覆蓋SaveChages並在保存之前打開事務,但是選擇查詢不會以這種方式在事務中執行。
這裡還有一個問題:我們將EF Plus的全局過濾器用於可移動的軟實體。它工作良好,但是針對上下文的過濾器初始化相當慢。我們也希望將其延遲到對DB的第一個實際請求。
問題是儘管調用了一個動作,您的UnitOfWork
仍被注入到控制器中,因此即使您不需要使用它,其構造函數也總是被調用。一種解決方案是使用Autofac 惰性注入 。在這種情況下,僅在需要其實例時才調用UnitOfWork
的構造函數
public class SomeController : Controller {
//..
private readonly Lazy<IUnitOfWork> _unitOfWork;
private IAnotherService UnitOfWork => _unitOfWork.Value;
public SomeController(
//..
Lazy<IUnitOfWork> unitOfWork
)
{
//..
_unitOfWork = unitOfWork;
}
//..
public ActionResult ActionNeedsTransaction()
{
//use UnitOfWork
UnitOfWork.SaveChanges();
return Json(value);
}
}