DI,实体框架和延期执行

时间:2013-04-22 03:51:21

标签: 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.Expired == true);
}

此业务类注入我的Controller

public class UsersController : Controller {
    public UsersController(Business business) {
        this.Business = business;
    }

    public ActionResult Home() {
        return View(new HomeViewModel(business.ExpiredUsers());
    }
}

用户是一个IQueryable,我的业务方法使用Entity Framework很好地转换为SQL。我的问题/关注是在执行此方法之后,查询导致延迟执行的用户对象的属性。在我的情况下,请说视图中的某些内容会进入每个用户的address.State.Cities,或其他一些导致延迟执行和查询数据库n次的属性。

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

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

1 个答案:

答案 0 :(得分:-1)

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

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