2011-12-02 56 views
6

我使用ninject這樣Httpcontext.Session總是空與Ninject

private void RegisterDependencyResolver() 
{ 
    HttpContextBase context = new HttpContextWrapper(HttpContext.Current); 
    var kernel = new StandardKernel(); 
    kernel.Bind<ISession>().To<SessionService>() 
          .InRequestScope() 
          .WithConstructorArgument("context", ninjectContext => context); 

    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
} 

RegisterDependencyResolver注入的HttpContext()被調用在Application_Start方法。

此接口注入到處理會話的類的構造函數中。

問題是會話永遠不會被初始化,所以我不能添加任何東西。

任何類似context.session [「something」] =「something」的代碼都會產生一個空引用異常。

Application_Start是否在生命週期中過早?我想.InRequestScope()修復這個,但它不適合我。

+0

沒有一個會話的應用程序啓動時。 – Amy

+0

請看https://github.com/ninject/ninject.web.mvc/blob/Maintenance_2.2/mvc3/src/Ninject.Web.Mvc/Bootstrapper.cs行數:68和69 –

回答

9

如果您在IIS集成模式下運行,則您無權訪問Application_Start中的任何Http上下文對象。

嘗試這樣的:

private void RegisterDependencyResolver() 
{ 
    kernel 
     .Bind<ISession>() 
     .To<SessionService>() 
     .InRequestScope() 
     .WithConstructorArgument(
      "context", 
      ninjectContext => new HttpContextWrapper(HttpContext.Current) 
     ); 

    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 
}