Ninject 3 InRequestScope не возвращает тот же экземпляр для того же запроса

Недавно я обновил один из моих проектов MVC3 с Ninject 2 до Ninject 3.

После нескольких минут попыток выяснить, почему InRequestScope больше не был доступен, я обнаружил, что теперь это расширение Ninject.Web.Common.

Теперь, когда я пытаюсь запустить приложение, Ninject работает так, как если бы все типы, связанные с областью действия InRequest, были бы InTransientScope; новый экземпляр создавался каждый раз.

В моем классе, который наследуется от NinjectModule, у меня есть простое связывание:

Bind<ViewModel.Activity>().ToSelf().InRequestScope();

В моем контроллере у меня есть 2 свойства типа ViewModel.Activity, помеченные атрибутом Ninject.

  [Inject]
  public ViewModel.Activity Activity { get; set; }

  [Inject]
  public ViewModel.Activity Activity1 { get; set; }

Если я посмотрел в режиме отладки значение HashCode обоих свойств, то все они имеют разные значения, но HttpContext одинаков; Я в том же запросе.

Что я упустил, как правильно использовать новый Ninject.Web.Common.InRequestScope с новой версией Ninject 3?

Большое спасибо.

 Samuel14 мая 2012 г., 23:37
Таможенная фабрика
 Samuel15 мая 2012 г., 20:11
@MystereMan Большое спасибо. Это именно то, что я хочу. Я использовал NuGet, чтобы найти Ninject MVC3 и просто добавить то, что вы сказали в NinjectWebCommon для привязки моих зависимостей, и это работает. Я думаю, что ключ к этой работе из-за этих строк: DynamicModuleUtility.RegisterModule (typeof (OnePerRequestHttpModule)); и DynamicModuleUtility.RegisterModule (typeof (NinjectHttpModule)); OnePerRequestHttpModule также будет избавляться от всех моих единиц работы сразу после каждого запроса. Большое спасибо!
 Erik Funkenbusch14 мая 2012 г., 23:21
Как вы подключаете Ninject к своему коду? Вы используете Ninject.MVC3 из nuget, а затем редактируете файл NinjectWebCommon.cs? или вы делаете кастомную фабрику контроллеров?

Ответы на вопрос(2)

Ninject.Web.Common не может использоваться автономно. Вы должны использовать какое-то дополнительное расширение web или wcf или реализовать InRequestScope самостоятельно.

 15 мая 2012 г., 09:35
@Samuel Вы смотрели в Ninject.Extension.Mvc * и Ninject.Extensions.Wcf?
 Samuel15 мая 2012 г., 20:17
Спасибо вам, ребята. Как я сказал MystereMan в комментарии, включая ссылку на Ninject MVC3 с NuGet, это решило все мои проблемы.
 Samuel15 мая 2012 г., 02:25
Привет, Ремо, спасибо, что помогаешь мне. Я поискал в расширениях и в Google & gt; InHttpRequestScope & apos; но я не нашел никакой информации, помогающей мне реализовать InHttpRequestScope. В каком расширении я могу найти этот метод, класс?
 15 мая 2012 г., 01:30
Нет, этого недостаточно, потому что InRequestScope может означать InWCFRequestScope или InHttpRequestScope, а в будущем, вероятно, и другие области. Web.Common ничего не знает о различных типах запросов. Я настоятельно советую использовать одно из веб-расширений. Нет оснований для создания собственных фабрик, и я не поддерживаю их. Посмотрите на расширения и скопируйте всю логику оттуда, если вы действительно хотите использовать свою собственную фабрику.
 Samuel15 мая 2012 г., 01:23
Спасибо, Римо, за уделенное время. У вас есть пример кода того, как его реализовать. В моем модуле я использую синтаксис bind для типа, который я хочу внедрить, и с помощью использования ninject.web.common я вызываю в конце инструкции bind метод InRequestScope. Недостаточно сказать ninject, какую область я хочу?
Решение Вопроса

Added as an answer so this can be closed out

Не используйте пользовательскую фабрику. Просто установите Ninject.MVC3 и скопируйте свои привязки в файл NinjectWebCommon.cs, а затем удалите весь свой старый код.

 Samuel05 авг. 2013 г., 16:46
Извините моя ошибка.
 03 авг. 2013 г., 23:28
@ Самуил - я изначально разместил это как комментарий, но вы попросили меня опубликовать его как ответ, чтобы он мог быть помечен как ответ. Я так и сделал, а вы на самом деле пометили это как ответ. Затем, по какой-то причине, вы вдруг решили снять отметку с ответа.
 Samuel03 авг. 2013 г., 13:27
Что этот комментарий добавлен в начале ответа?

Ваш ответ на вопрос