NInject: Где вы храните свою ссылку на Ядро? - PullRequest
48 голосов
/ 26 февраля 2009

Я использую NInject в новом веб-приложении, и мне неясны две вещи:

  1. Разве мне не нужно хранить ссылку на Ядро вокруг (переменная Session / App), чтобы GC не собирал все мои экземпляры? Например, если я укажу .Using () и тогда объект Kernel будет собран, разве не все мои "одиночные игры" тоже собраны?

  2. Если мне нужно сохранить ссылку на объект Kernel, как мне разрешить изменение аргументов, переданных в WithArguments (), или это невозможно.

Ответы [ 3 ]

29 голосов
/ 26 февраля 2009

Это правда, что вы не хотите передавать ядро. Обычно в веб-приложении ядро ​​хранится в статическом свойстве в приложении HttpApplication. Если вам нужна ссылка на ядро, вы можете просто предоставить зависимость (через аргумент или свойство конструктора) типа IKernel, а Ninject даст вам ссылку на ядро, которое активировало тип.

Если вы используете WithArguments () для привязки, они будут использоваться для всех активаций. Если вы используете IParameters, они будут использоваться только для этой активации. (Тем не менее, если активируемый вами сервис имеет многократное использование, например Singleton, он не будет повторно активирован, даже если вы передадите разные IParameters.)

16 голосов
/ 26 февраля 2009

Это распространенная ошибка при использовании контейнера IoC. См этот связанный вопрос .

В двух словах:

  • Плохо практиковать раздачу контейнера (был там, сделал это, и это действительно больно)
  • Если вам действительно нужно напрямую вызывать контейнер, сначала рассмотрите возможность абстрагирования от внедренной фабрики, затем в качестве последнего ресурса рассмотрите возможность использования статического шлюза для контейнера
0 голосов
/ 22 марта 2011

Марк Симан - автор Внедрение зависимости Мэннинга Достаточно использовать Голливудский принцип Вместо этого не звоните нам (в рамках МОК) Мы будем называть вас ... Контейнер должен быть помещен в корень Композиции приложения ... и должен быть создан в соответствии с запросом ... как упомянуто wattate

.. Для веб-приложения корнем Composition является файл Global.asax, в котором вы можете использовать переопределение событий запуска и там вы можете связать свой Ninject для разрешения компонента

...