Могу ли я указать область действия в Ninject только для этой конкретной ситуации? - PullRequest
5 голосов
/ 14 марта 2011

Ранее я задавал этот вопрос . Ответ на который привел к другому вопросу, как ты видишь перед собой.

Начальная проблема

Моя проблема в том, что у меня есть пользовательский MembershipProvider, использующий AccountRepository, использующий ObjectContext. Поскольку MembershipProvider - это Singleton в MVC (как я понимаю), AccountRepository и его ObjectContext должны вводиться один раз и оставаться там до конца жизни MembershipProvider.

Однако в моих контроллерах я также использую репозитории с контекстами объектов. В этих контроллерах мне нужно, чтобы контекст объекта был разделен между репозиториями с запросом. У меня есть следующая привязка:

Bind<IMyContext>().To<MyObjectContext>().InRequestScope();
// put bindings here
Bind<IAccountRepository>().To<EFAccountRepository>

и в Application_Start()

kernel.Inject(Membership.Provider);

Проблема в том, что Ninject явно вызывает dispose для контекста объекта, когда считает, что запрос выполнен (думаю, через 30 секунд).

Мое (неработающее) решение

Я заметил, что когда вы устанавливаете привязки, вы можете указать "при инъекции в". Проблема в том, что мне нужно «при инъекции при инъекции в». То есть при внедрении контекста объекта в контроллер учетной записи при внедрении контроллера учетной записи в поставщика членства. И у меня, кажется, этого нет ...

Обходные пути, о которых я думал (но на самом деле не люблю).

  1. Не вешайте MyMembershipProvider в MVC. Просто вставьте его экземпляр (позади и интерфейс) в контроллеры, которые нуждаются в этом, как я делаю с репозиториями. Затем Ninject создаст экземпляр провайдера для каждого запроса. Мне это не нравится, потому что я уверен, что у MVC есть причина для создания провайдера членства как одиночного.
  2. Найдите событие, которое происходит при каждом запросе, и снова вызовите kernel.Inject в каждом событии. Повторная инициализация провайдера - каждый запрос почти эквивалентен повторной инициализации, за исключением более грязного.
  3. Создайте отдельный репозиторий учетной записи для провайдера членства, к которому я могу привязаться другим способом. Кажется неправильным изменять мою объектную модель из-за Ninject.
* * Заключение тысячи сорок-девять

ИМХО первый обходной путь самый лучший. Тем не менее, я скорее нахожу способ установить привязку Ninject так, как я хочу.

Что мне делать?

1 Ответ

3 голосов
/ 14 марта 2011

Бит .InRequestScope() вызывает удаление некоторых ваших объектов (см. Кэширование и сбор ).

Вам нужно, чтобы это (просмотр по запросу) не происходило при обеспечении зависимостей вашего провайдера.

Одним из способов достижения этого является наличие двух привязок - одной для ветви обработки запросов и одной для глобального контекста, т. Е. Путем добавления When ..., который использует цепочку context.ParentContext ... для управления это InRequestScope() или нет

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

...