Регистр Ninject на запрос

В моем приложении ASP.NET MVC 3 используется интеграция Ninject и Ninject ASP.NET MVC 3. Я перегрузил метод CreateKernel.

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

if (Language == Language.English)
  //register English language implementations
else if (Language == Language.Russian)
  //register Russain language implementations

Я думал, что некоторые из методов Global_asax, специфичных для запросов, были бы хорошим местом, и попытался получить доступ к некоторым свойствам NinjectHttpApplicaton для регистрации зависимостей для каждого запроса. Я получил доступ к ядру и получил устаревшее предупреждение «Не используйте Ninject в качестве локатора служб». Что я делаю неправильно? Как это правильно делать?


person SiberianGuy    schedule 24.07.2011    source источник


Ответы (1)


Чтобы изменить реализацию на основе некоторого условия, например языка, вы должны использовать условные привязки. Например. Bind<IFoo>().To<Foo>().When(ctx => Language == Language.English)

person Remo Gloor    schedule 25.07.2011
comment
Вы правы, я могу зарегистрировать свои зависимости таким образом в CreateKernel. Но я бы предпочел зарегистрировать их в InRequestScope вместо создания пользовательской лямбда-области. - person SiberianGuy; 25.07.2011
comment
Условие - это не область действия. Он просто определяет, когда применяется привязка. Вы все еще можете использовать InRequestScope - person Remo Gloor; 25.07.2011
comment
Я понимаю. Но я хочу вычислить (один раз) язык (или любое другое условие, зависящее от запроса) динамически и настроить для него все зависимости. - person SiberianGuy; 25.07.2011
comment
Извините, я сначала не понял, что вы разработчик этой библиотеки :) Почему не рекомендуется регистрировать зависимости напрямую через свойство ядра? В моем случае это выглядит вполне разумно, не так ли? - person SiberianGuy; 25.07.2011
comment
Если вы зарегистрируете привязки для каждого запроса, вы получите тысячи привязок для одного и того же через короткое время и столкнетесь с OutOfMemoryException. Но, скорее всего, второй запрос уже завершится ошибкой, поскольку для одного и того же есть две безусловные привязки. Стандартный способ - зарегистрировать все необходимые привязки при запуске приложения и использовать их на протяжении всего жизненного цикла приложения. - person Remo Gloor; 25.07.2011
comment
Но как я могу получить OutOfMemoryException, если я зарегистрирую их по запросу. Не будут ли они очищены после завершения запроса? - person SiberianGuy; 25.07.2011
comment
Область не показывает, как долго существует привязка, но как долго существуют объекты, созданные этой привязкой. - person Remo Gloor; 25.07.2011
comment
Хорошо, теперь я понял. Спасибо! - person SiberianGuy; 25.07.2011