【发布时间】:2013-04-22 03:51:21
【问题描述】:
我在我的项目上设置了 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());
}
}
Users 是一个 IQueryable,我的业务方法使用实体框架很好地转换为 SQL。我的问题/担心是在执行此方法后,查询用户对象的属性导致延迟执行。就我而言,假设视图中的某些内容进入了每个用户的 address.State.Cities 或其他导致延迟执行和查询数据库 n 次的属性。
我已经使用 Ninject 将 DI 设置为每个请求一次的数据库上下文 (IUnitOfWork)。由于数据库上下文仍处于打开状态,我不知道如何防止这种情况发生。我宁愿视图抛出异常;这样我就可以及早发现这些问题。为了完整起见,这是我的模块。
public class Module : NinjectModule
{
public override void Load()
{
this.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
}
}
【问题讨论】:
-
address.State.Cities 是发生在 View 内部还是 ViewModel 内部?如果它在视图内部,那么视图未编译的事实将迫使您在上下文中发出额外的查询。
标签: c# .net asp.net-mvc dependency-injection ninject