NInject: Где вы держите свою ссылку на ядро?
Я использую NInject в новом веб-приложении, и есть две вещи, которые мне непонятно:
-
Не нужно ли ссылаться на ядро вокруг (переменная Session/App), чтобы гарантировать, что GC не собирает все мои экземпляры? Например, если я укажу .Using(), а затем объект Kernel будет собран, не все ли мои "синглтоны" собраны?
-
Если мне нужно сохранить ссылку на объект Kernel, как разрешить переменные, переданные в WithArguments(), изменить или это невозможно.
Ответы
Ответ 1
Это правда, что вы не хотите передавать ядро. Как правило, в веб-приложении я храню ядро в статическом свойстве в HttpApplication. Если вам нужна ссылка на ядро, вы можете просто разоблачить зависимость (через аргумент или свойство конструктора), которая относится к типу IKernel, а Ninject даст вам ссылку на ядро, которое активировало тип.
Если вы используете WithArguments() для привязки, они будут использоваться для всех активаций. Если вы используете IP-параметры, они будут использоваться только для этой активации. (Однако если служба, которую вы активируете, имеет повторяющееся поведение, такое как Singleton, она не будет повторно активирована, даже если вы передадите разные IP-параметры.)
Ответ 2
Это обычная ошибка при использовании контейнера IoC. См. этот связанный вопрос.
В двух словах:
- Неплохая практика, чтобы проходить ваш контейнер вокруг (был там, сделал это, и это действительно больно)
- Если вам действительно нужно напрямую открыть контейнер, сначала рассмотрите абстрагирование с введенным factory, а затем в качестве последнего ресурса рассмотрим использование статического шлюза в контейнере
Ответ 3
Марк Симан - автор "Инъекция зависимостей" . Предположите использовать принцип Голливуда. Не называйте нас (IOC framework) вместо этого Мы будем называть вас.... Контейнер IOC должен быть помещен в корневой каталог приложения.. и ему необходимо создать экземпляр в соответствии с запросом. Например, упомянутый ниже указатель
.. Для веб-приложения корнем композиции является файл Global.asax, в котором вы можете использовать переопределение событий запуска и там u можете связать ваш Ninject для решения компонента