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

Creating a Ninject Kernel in Global.asax where a binding has a dependency on HttpContext

我在创建内核时一直收到错误 "System.Web.HttpException: Request is not available in this context"。考虑到我的一个绑定依赖于 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();
      }
}

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

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

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

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