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 ответ

Решение

Есть два вопроса с вашим кодом:

  1. Ninject неправильно инициализируется. Вам нужен один из пакетов Ninject.MVCx (в зависимости от используемой версии MVC). Чтобы правильно настроить его, см.: http://github.com/ninject/ninject.web.mvc

  2. Вы вводите PerRequestResourceProvider (тип класса), а не IPerRequestResourceProvider (тип интерфейса) в HomeController, Таким образом .InRequestScope() определены на IPerRequestResourceProvider привязка не дает никакого эффекта. Изменить HomeController конструктор для ввода типа интерфейса, и все хорошо.


Ninject не требует привязок для экземпляров (не абстрактных,..) классов. Вот почему это не очевидно, когда используется неправильная привязка.

Другие вопросы по тегам