Ошибка активации HttpContext - доступно более одной подходящей привязки - PullRequest
6 голосов
/ 05 октября 2011

У меня есть приложение ASP.NET MVC с простым модулем NinjectModule:

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

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

Ошибка активации HttpContext
Доступно несколько сопоставлений.
Путь активации:
3) Внедрение зависимостиHttpContext в параметр httpContext конструктора типа UserInfo
2) Внедрение зависимости UserInfo в параметр userInfo конструктора типа HomeController
1) Запрос на HomeController

Предложения:
1) Убедитесь, что выопределили привязку для HttpContext только один раз.

В сообщении об ошибке говорится, что я определил привязку 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 более одного раза?

Ответы [ 2 ]

5 голосов
/ 05 октября 2011

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

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

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

1 голос
/ 05 октября 2011

Может понадобиться быстро просмотреть этот вопрос и посмотреть, не похож ли он на вашу проблему: Ошибка «Доступно более одной совпадающей привязки» при использовании Ninject.Web.Mvc 2.0 и ASP.NET MVC 1.0

...