我们使用ASP.Net MVC + Autofac + EF6。 DbContext由UnitOfWork包装。我们通过Autofac为每个http请求创建它。 我们还在UnitOfWork构造函数中为整个http请求打开事务。
问题在于,并非所有http请求都必须包装在事务中。其中一些甚至没有向数据库的请求。
我们希望将事务打开延迟到对DB的第一个实际请求。 有什么想法可以做到吗?
我们可以覆盖SaveChages并在保存之前打开事务,但是选择查询不会以这种方式在事务中执行。
这里的另一个问题是:我们将EF Plus的全局过滤器用于可移动的软实体。它工作良好,但是针对上下文的过滤器初始化相当慢。我们也希望将其延迟到对DB的第一个实际请求。
答案 0 :(得分:1)
问题在于,尽管已调用某个动作,但您的UnitOfWork
仍被注入到控制器中,因此即使您不需要使用它,其构造函数也总是被调用。一种解决方案是使用Autofac lazy injection。在这种情况下,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);
}
}