Вопрос по ninject, c#, asp.net-mvc-3 – Ninject 3 InRequestScope не возвращает тот же экземпляр для того же запроса

10

Недавно я обновил один из моих проектов 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?

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

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

Ваш Ответ

2   ответа
7

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

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

Added as an answer so this can be closed out

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

Что этот комментарий добавлен в начале ответа? Samuel
@ Самуил - я изначально разместил это как комментарий, но вы попросили меня опубликовать его как ответ, чтобы он мог быть помечен как ответ. Я так и сделал, а вы на самом деле пометили это как ответ. Затем, по какой-то причине, вы вдруг решили снять отметку с ответа.
Извините моя ошибка. Samuel

Похожие вопросы