Подтвердить что ты не робот

NInject: Где вы держите свою ссылку на ядро?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Марк Симан - автор "Инъекция зависимостей" . Предположите использовать принцип Голливуда. Не называйте нас (IOC framework) вместо этого Мы будем называть вас.... Контейнер IOC должен быть помещен в корневой каталог приложения.. и ему необходимо создать экземпляр в соответствии с запросом. Например, упомянутый ниже указатель

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