在Global.asax中创建Ninject内核,其中绑定依赖于HttpContext

时间:2015-02-23 16:11:07

标签: c# .net ninject global-asax httpcontext

我一直收到错误" System.Web.HttpException:请求在此上下文中不可用"在创建我的内核时。鉴于我的一个绑定依赖于Context,这是有道理的。显然,Application_Start上不应出现任何上下文。我只是想知道是否有人知道如何解决这个问题。

public class NinjectBindings : NinjectModule
{
    public override void Load()
    {     
        //Framework
        Bind<IJsonLayer>().To<JsonLayer>();
        Bind<IBusinessLayer>().To<BusinessLayer>();

        //Controllers
        Bind<ITeamController>().To<TeamController>();
    }
}


public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        ReflectionUtility.Kernel = new StandardKernel(new NinjectBindings());
    }
}


public class ReflectionUtility
{
    private static IKernel _kernel;

    public static IKernel Kernel {
        set { _kernel = value; }
    }
}



public class JsonLayer : IJsonLayer
{
    private readonly ITeamController _teamController;
    private readonly IBusinessLayer _businessLayer;

    public JsonLayer(ITeamController teamController, IBusinessLayer businessLayer)
    {
        _teamController = teamController;
        _businessLayer = businessLayer;
    }
}


public class BusinessLayer : IBusinessLayer
{
    //this is a super-simplification of what's going on. there are multiple different calls to HttpContext.Current.Request in this class
    public BusinessLayer()
    {
         //This is where it breaks
         var sessionUserId = HttpContext.Current.Request.Headers["X-SessionUserId"];
    }

}

public class TeamController : ITeamController
{
      public void DeleteTeam(int intTeam)
      {
          throw new NotImplementedException();
      }
}

1 个答案:

答案 0 :(得分:0)

您认为,从HttpContext图层访问Business是个好主意吗?也许你可以花一些时间进行重构?例如,this之类的东西。

从应用程序的角度来看,你可以这样做:

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

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