我在我的項目上建立了DI注入,注入IUnitOfWork的實現,該實現有我的存儲庫和Commit()方法。我把這個注入到我的業務層中,一切都很好。DI,實體框架和延期執行
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());
}
}
用戶是一個IQueryable,和我的商業方法使用實體框架很好地轉化爲SQL。我的問題是,在執行此方法後,查詢用戶對象上的屬性,從而導致延遲執行。在我的情況下,說視圖中的東西進入每個用戶的地址.State.Cities,或其他一些導致推遲執行和查詢數據庫的屬性n次。
我已經設置DI,使用Ninject爲每個請求創建數據庫上下文(IUnitOfWork)。由於數據庫上下文仍處於打開狀態,因此我不知道如何防止發生這種情況。我寧願視圖拋出異常;以便我可以儘早地發現這些問題。爲了完整起見,這裏是我的模塊。
public class Module : NinjectModule
{
public override void Load()
{
this.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope();
}
}
是在address.State.Cities查看內部或視圖模型裏面發生了什麼?如果它位於視圖內部,那麼視圖未編譯的事實將迫使你的上下文發出額外的查詢。 – andresuribe 2013-04-22 03:59:50