Я наткнулся на этот вопрос, когда заметил, что внедрение свойства (через [Inject]
и kernel.Inject(instance)
в контроллере заняло около 3 секунд, что очень сильно задерживает обработку запросов для определенного контроллера. Большинство других контроллеровбыли затронуты в меньшей степени.
Короткий ответ
Да, Ninject явно приносит накладные расходы, но я обнаружил, что зависит от трех факторов: версия библиотеки, размер дерева зависимостейи как решается зависимость.
Стремитесь к большей версии (3.3.4+), убедитесь, что зависимость не вызывает много зависимостей, которые нужно решить, и что вы используете внедрение конструктора, а не внедрение свойства.
Длинный ответ
1. Схема внедрения - Я столкнулся с проблемами производительности при использовании инъекции свойства. Быстрый выигрыш состоял в том, чтобы заменить его prop => kernel.Get<IFoo>()
, ноэтот шаблон не рекомендуется (3.3.4 помечает прямое использование ядра как устаревшее), однако он сокращает время, необходимое дляСсылка без проведения рефакторинга.
2.Дерево зависимостей - мое приложение использовало несколько общих репозиториев, внедренных в доступ к данным с определенными областями, которые, в свою очередь, были внедрены в несколько сервисов.Для некоторых сервисов это создавало большое дерево зависимостей, которое требовало много времени для решения.Уменьшение этого дерева значительно улучшило производительность.
3.Версия библиотеки - Я обновил библиотеку с 3.2.0 до 3.3.4 и заметил значительное улучшение производительности.Однако я заплатил за множественные изменения внутри приложения (переход с NinjectWebCommon
на MvcApplication
и обновление различных библиотек, таких как Castle.Core, Ninject.MockingKernel, Ninject.MockingKernel.NSubstitute, Ninject.Web.Common.WebHost)