C# DI、实体框架和延迟执行

C# DI、实体框架和延迟执行,c#,.net,asp.net-mvc,dependency-injection,ninject,C#,.net,Asp.net Mvc,Dependency Injection,Ninject,我已经在我的项目上设置了DI注入,它注入了一个IUnitOfWork的实现,它有我的存储库和一个Commit()方法。我把它注入我的业务层,一切都很好 public Business(IUnitOfWork context) { this.Context = context; } public IEnumerable<User> ExpiredUsers() { return this.Context.Users.Query().Where(u => u.Ex

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

public Business(IUnitOfWork context) {
    this.Context = context;
}

public IEnumerable<User> ExpiredUsers() {
    return this.Context.Users.Query().Where(u => u.Expired == true);
}
用户是IQueryable,我的业务方法使用实体框架很好地转换为SQL。我的问题/担忧是在执行此方法后,查询用户对象上的属性会导致延迟执行。在我的例子中,假设视图中的某些内容进入每个用户的address.State.Cities或其他一些属性,导致延迟执行并查询数据库n次

我使用Ninject将DI设置为每个请求一次数据库上下文(IUnitOfWork)。由于数据库上下文仍然打开,我不知道如何防止这种情况发生。我宁愿把这个观点作为一个例外;这样我就能早点发现这些问题。为了完整起见,这里是我的模块

public class Module : NinjectModule
{
    public override void Load()
    {
        this.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
    }
}
公共类模块:Ninject模块
{
公共覆盖无效负载()
{
this.Bind().To().InRequestScope();
}
}

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


address.State.Cities是发生在视图中还是发生在ViewModel中?如果它在视图内,然后,视图未被编译的事实将迫使您的上下文发出额外的查询。这也很有趣,请查看下一票的原因-不确定如何防止多次枚举
过期用户的结果的代码不会导致多次查询执行…这会将数据带到内存中,其中ToList()调用,但它不会阻止视图导致延迟执行,至少在我的情况下是这样。我想知道InRequestScope是否太大,是否可以将其限制在业务类中。我再次查看了它-看起来您得到了一组查询,这就是为什么每次更新时都要执行这些查询。尝试更改函数以实际执行查询,而不是返回查询。@Michael,对不起-我实际上读错了答案-它确实没有帮助,值得-1,因为它不能阻止多个查询。要改进它,只需缓存ToList()的结果,并在后续调用
ExpiredUsers
时返回缓存的值。
public class Module : NinjectModule
{
    public override void Load()
    {
        this.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
    }
}
return this.Context.Users.Query().Where(u => u.Expired == true).ToList();