Каков наилучший способ сброса контейнера Ninject's IKernel в приложении MVC? - PullRequest
2 голосов
/ 20 мая 2010

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 22 мая 2010

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

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

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

    // Do your Load() and ServiceLocator stuff here

    return kernel;
}

Для справки: реализация на сайте Ninject .

0 голосов
/ 20 мая 2010

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

...