ASP.NET MVC + Ninject: InRequestScope
Я хочу, чтобы создать экземпляр PerRequestResourceProvider, используя Nineject InRequestScope:
public class PerRequestResourceProvider: IPerRequestResourceProvider
{
priavte readonly _perRequestResorceInstance;
public PerRequestResourceProvider()
{
_perRequestResorceInstance = new PerRequestResource();
}
public PerRequestResource GetResource()
{
return _perRequestResorceInstance;
}
}
public interface IPerRequestResourceProvider
{
PerRequestResource GetResource();
}
В моем NinjectDependencyResolver:
.....
kernel.Bind<IPerRequestResourceProvider>.To<PerRequestResourceProvider>().InRequestScope();
Я внедряю IPerRequestResourceProvider в нескольких классах. Но когда я добавляю точку останова в конструктор PerRequestResourceProvider, я вижу, что PerRequestResourceProvider создается три раза за один запрос, а не один за запрос. В чем дело?
Обновление: исходный код ttps: //bitbucket.org/maximtkachenko/ninjectinrequestscope/src
1 ответ
Есть два вопроса с вашим кодом:
Ninject неправильно инициализируется. Вам нужен один из пакетов Ninject.MVCx (в зависимости от используемой версии MVC). Чтобы правильно настроить его, см.: http://github.com/ninject/ninject.web.mvc
Вы вводите
PerRequestResourceProvider
(тип класса), а неIPerRequestResourceProvider
(тип интерфейса) вHomeController
, Таким образом.InRequestScope()
определены наIPerRequestResourceProvider
привязка не дает никакого эффекта. ИзменитьHomeController
конструктор для ввода типа интерфейса, и все хорошо.
Ninject не требует привязок для экземпляров (не абстрактных,..) классов. Вот почему это не очевидно, когда используется неправильная привязка.