DI、实体框架和延迟执行

本文关键字:延迟 执行 框架 实体 DI | 更新日期: 2023-09-27 18:10:27

我已经在我的项目上设置了DI注入,它注入了IUnitOfWork的实现,它具有我的存储库和Commit()方法。我把它注入我的业务层,一切都很好。

public Business(IUnitOfWork context) {
    this.Context = context;
}
public IEnumerable<User> ExpiredUsers() {
    return this.Context.Users.Query().Where(u => u.Expired == true);
}

这个业务类被注入到我的控制器

public class UsersController : Controller {
    public UsersController(Business business) {
        this.Business = business;
    }
    public ActionResult Home() {
        return View(new HomeViewModel(business.ExpiredUsers());
    }
}

Users是一个IQueryable,我的业务方法使用实体框架很好地转换为SQL。我的问题/关注是在执行此方法后,查询用户对象上的属性导致延迟执行。在我的例子中,假设视图中的某些内容进入每个用户的address.State。

,或者其他属性导致延迟执行和查询数据库n次。

我已经设置了DI,使数据库上下文(IUnitOfWork)为每个请求一次,使用Ninject。由于数据库上下文仍然是打开的,我不知道如何防止这种情况发生。我宁愿视图抛出一个异常;这样我就能及早发现这些问题。为了完整起见,下面是我的模块。

public class Module : NinjectModule
{
    public override void Load()
    {
        this.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
    }
}

DI、实体框架和延迟执行

通过调用ToList()强制ExpiredUsers枚举列表:

return this.Context.Users.Query().Where(u => u.Expired == true).ToList();