0

我们使用 ASP.Net MVC + Autofac + EF6。DbContext 由 UnitOfWork 包装。我们通过 Autofac 为每个 http 请求创建它。我们还在 UnitOfWork 构造函数中为整个 http 请求打开事务。

问题是并非所有的 http 请求都必须包含在事务中。他们中的一些人甚至没有对 DB 的请求。

我们想将事务打开延迟到对 DB 的第一个实际请求。任何想法如何做到这一点?

我们可以覆盖 SaveChages 并在保存之前打开事务,但是选择查询不会以这种方式在事务中执行。

这里还有一个问题:我们使用 EF Plus 的全局过滤器来处理软可移动实体。它工作得很好,但是上下文的过滤器初始化相当慢。我们也想将它推迟到对 DB 的第一个实际请求。

4

1 回答 1

1

问题是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);
    }

}
于 2019-10-20T19:22:17.610 回答