2

В основном в моем коде Global.asax У меня есть следующее свойство IKernel для настройки Ninject, подобное этому (также пользуясь преимуществами Microsoft.Practices.ServiceLocation). Этот контейнер автоматически вызывается на один раз, кажется, на CreateKernel() переопределение:Каков наилучший способ сбросить контейнер IKernel Ninject в приложении MVC?

protected override IKernel CreateKernel() 
     { 
      return Container; 
     } 

и мой контейнер собственности:

static IKernel _container; 
     public static IKernel Container 
     { 
      get 
      { 
       if (_container == null) 
       { 
        _container = new StandardKernel(); 
        _container.Load(new SiteModule(_container)); 
        ServiceLocator.SetLocatorProvider(() => _container.Get<IServiceLocator>()); 
       } 
       return _container; 
      } 
     } 

Как вы можете видеть, я загрузке просто один модуль, определяющий список моего интерфейса < -> привязки сервисов, которые не должны быть важны для этой проблемы, но моя проблема - независимо от того, насколько сильно я стараюсь, я не могу снова получить свой _ container null, когда он был первоначально создан при перезагрузке моего веб-сайта MVC , Из редактирования и повторного сохранения файла Web.config (старый старый трюк), чтобы смыть пул приложений или даже перезапустить IIS (!), Мой контейнер , по-видимому, все еще существует. Я действительно не понимаю, как это может быть. Я знаю, что на моих начальных нагрузках _container имеет значение null, а SiteModule действительно загружается.

Это проблема, конечно, потому что теперь я хотел бы добавить некоторые новые привязки для вновь созданных служб и контейнер никогда не возвращается к нулевой: P

FYI. Даже перемещение моей точки останова в тестовый тест контейнера не похоже на это, не спрашивайте меня, как это не исправляет проблему, но я знаю, что внутри этого должно быть действительно, потому что при начальной загрузке есть нет ошибок, все отлично складывается.

Спасибо, ребята, если вы чувствуете, что вам нужно увидеть SiteModule(), дайте мне знать, и я могу продлить этот пост кодом.

ответ

0

Вы пытались перезапустить свой веб-сервер? Я понимаю, что это не может быть вариантом в производстве, но он должен помочь вам пройти этап разработки (если он работает).

+1

Ну, как я уже сказал, я попытался перезапустить IIS, я не пытался перезапустить весь сервер =) – GONeale

0

Если я не ошибаюсь, CreateKernel() вызывается только один раз в течение Application_Start() (view source) так, если вы не используете Container в другом месте, есть ли польза для кэширования это?

Вы пробовали что-то вроде этого?

protected override IKernel CreateKernel() 
{ 
    IKernel kernel = new StandardKernel(); 

    // Do your Load() and ServiceLocator stuff here 

    return kernel; 
} 

Для справки: implementation сайт Ninject.

+0

Спасибо, чувак, посмотрит. – GONeale