Ранее я задавал этот вопрос . Ответ на который привел к другому вопросу, как ты видишь перед собой.
Начальная проблема
Моя проблема в том, что у меня есть пользовательский 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 секунд).
Мое (неработающее) решение
Я заметил, что когда вы устанавливаете привязки, вы можете указать "при инъекции в". Проблема в том, что мне нужно «при инъекции при инъекции в». То есть при внедрении контекста объекта в контроллер учетной записи при внедрении контроллера учетной записи в поставщика членства. И у меня, кажется, этого нет ...
Обходные пути, о которых я думал (но на самом деле не люблю).
- Не вешайте
MyMembershipProvider
в MVC. Просто вставьте его экземпляр (позади и интерфейс) в контроллеры, которые нуждаются в этом, как я делаю с репозиториями. Затем Ninject создаст экземпляр провайдера для каждого запроса. Мне это не нравится, потому что я уверен, что у MVC есть причина для создания провайдера членства как одиночного.
- Найдите событие, которое происходит при каждом запросе, и снова вызовите
kernel.Inject
в каждом событии. Повторная инициализация провайдера - каждый запрос почти эквивалентен повторной инициализации, за исключением более грязного.
- Создайте отдельный репозиторий учетной записи для провайдера членства, к которому я могу привязаться другим способом. Кажется неправильным изменять мою объектную модель из-за Ninject.
* * Заключение тысячи сорок-девять
ИМХО первый обходной путь самый лучший. Тем не менее, я скорее нахожу способ установить привязку Ninject так, как я хочу.
Что мне делать?