Ninject прекратил впрыскивать мои свойства - PullRequest
10 голосов
/ 27 ноября 2010

В базовом контроллере для MVC у меня был следующий код впрыска, и он работал отлично.

 [Inject]
 private INavigationRepository navigationRepository { get; set; }
 [Inject]
 private ISessionService sessionService { get; set; }

Я не получаю ошибки сборки, и он отображается в Желтой странице смерти как "Система.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. "и указывает на первую строку кода, которая ссылается на navigationRepository.

У меня может быть очень мало изменений кода, так как он работал, и даже поддержал эти изменения, но все равно получаю ошибку.Я могу обойти это с кодом ниже, но я теряю инъекции.Любые мысли о том, как справиться с этим?

private INavigationRepository navigationRepository;
    private ISessionService sessionService;
    public BaseController()
    {
        navigationRepository = new NavigationRepository();
        sessionService = new SessionService(new VolunteerRepository());
    }

Ответы [ 2 ]

34 голосов
/ 28 ноября 2010

Ninject может внедрять частные свойства, но он должен быть включен.

new StandardKernel( new NinjectSettings() { InjectNonPublic = true })

Но гораздо лучше не использовать внедрение свойств.Это следует использовать только в том случае, если нет способа избежать этого.Например, если инстанс создан кем-то другим (AttributeFilter).В противном случае зависимости могут быть установлены непреднамеренно извне, и вам понадобится атрибут Inject, который дает вам ссылку на контейнер IoC.Я бы предложил добавить зависимости в конструктор и использовать инъекцию конструктора.

1 голос
/ 27 ноября 2010

Изменение свойств для публичных работ. Я предполагаю, что если это личное, Ninject не может установить его.

[Inject]
public INavigationRepository navigationRepository { get; set; }
[Inject]
public ISessionService sessionService { get; set; }
...