2015-02-23 5 views
0

Я продолжаю получать сообщение об ошибке «System.Web.HttpException: запрос недоступен в этом контексте» при создании моего ядра. Это имеет смысл, учитывая, что одно из моих привязок имеет зависимость от контекста. Очевидно, что контекст не должен присутствовать на Application_Start. Мне просто интересно, знает ли кто, как это решить.Создание ядра Ninject в Global.asax, где привязка имеет зависимость от HttpContext

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(); 
     } 
} 
+0

Я бы не сделать зависимость из ряда 'HttpContext', когда вы просто настроить переменную содержать впрыскивается службу, я бы тогда назначить 'HttpContext' к свойству. Только потому, что это облегчает жизнь. –

ответ

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)); 
} 
+0

не уверен, почему это произошло, но это правильный способ подойти к этой проблеме. вам не нужны конкретные зависимости в вашем бизнес-слое. создать абстракцию! –