6

У меня есть приложение ASP.NET MVC с помощью простого NinjectModule:Ошибка активации HttpContext - более одного совпадения связывания доступно

public class MainModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<AppSettings>().ToSelf().InSingletonScope(); 
     Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem 
     Bind<MainDbContext>().ToSelf().InRequestScope(); 
     Bind<UserInfo>().ToSelf().InRequestScope(); 
    } 
} 

Это единственный связывающий код в целом мое приложение. Когда я запускаю мое приложение, я сразу получаю эту ошибку во время выполнения:

Error activating HttpContext
More than one matching bindings are available.
Activation path:
3) Injection of dependency HttpContext into parameter httpContext of constructor of type UserInfo
2) Injection of dependency UserInfo into parameter userInfo of constructor of type HomeController
1) Request for HomeController

Suggestions:
1) Ensure that you have defined a binding for HttpContext only once.

сообщение об ошибке, кажется, говорит, что я определил HttpContext связывание более чем один раз, но только обязательные заявления в целом применения в MainModule, и я четко определил только одну привязку для HttpContext. Если я прокомментирую эту строку кода, я перестаю получать ошибку, но неверно введенный HttpContext (это пустой, недавно созданный HttpContext, а не HttpContext.Current).

сообщение

ошибка делает описать точную последовательность впрыска, я бы ожидать, чтобы произойти ...

HttpContext должен получить впрыскивается в конструктор UserInfo, который выглядит следующим образом:

public class UserInfo 
{ 
    private readonly HttpContext _httpContext; 

    public UserInfo(HttpContext httpContext) 
    { 
     _httpContext = httpContext; 
    } 

    // ... etc ... // 
} 

И UserInfo должен вводится в конструктор HomeController, который выглядит следующим образом:

public class HomeController : Controller 
{ 
    private readonly AppSettings _appSettings; 
    private readonly UserInfo _userInfo; 

    public HomeController(AppSettings appSettings, UserInfo userInfo) 
    { 
     _appSettings = appSettings; 
     _userInfo = userInfo; 
     ViewData[Token.AppSettings] = _appSettings; 
     ViewData[Token.UserInfo] = _userInfo; 
    } 

    // ... actions here ... // 
} 

Почему это приводит к ошибке? Это похоже на очень простой сценарий инъекции зависимостей. Каким образом я определяю привязку для HttpContext более одного раза?

+0

Вы показали нам главный модуль. Вы не сказали нам, используете ли вы Ninject.Web.MVC3 и/или где создается ваше Ядро. Ошибка настоятельно предполагает, что вы выполняете загрузку модулей в одно ядро ​​более одного раза, например. путем запуска его в вас «Global' /' HttpApplication' construction/start (из которых почти всегда> 1). –

ответ

5

Если вы используете расширение Ninject.MVC3, чем вы должны удалить

Bind<HttpContext>().ToMethod(context => HttpContext.Current); // <-- problem 

потому что HttpContext привязка уже добавлена ​​расширением.

+0

Да, я использую пакет Ninject.MVC3 nuget, и вы правы, устраняя это связывание, исправляет проблему. Первоначально я думал, что получаю пустой «HttpContext», когда я удалял привязку, но это оказалось вызвано чем-то другим. В любом случае, спасибо за вашу помощь! – devuxer