Ответ 1
Мне кажется, что вы делаете преждевременную оптимизацию: не делайте этого.
Конструкторы ваших сервисов не должны делать ничего более, чем хранить зависимости, которые он принимает в приватных полях. В таком случае создание такого объекта действительно легковесно. Не забывайте, что создание объектов в .NET действительно быстро. В большинстве случаев, с точки зрения производительности, просто не имеет значения, вводятся ли эти зависимости или нет. Особенно, если сравнивать с количеством объектов, которые выкладывает остальная часть вашего приложения (и используемые вами фреймворки). Реальные затраты - это когда вы начинаете использовать веб-сервисы, базы данных или файловую систему (или ввод-вывод в целом), потому что они вызывают гораздо большую задержку.
Если создание действительно дорого, вы обычно должны скрывать создание за Виртуальным прокси-сервером, а не внедрять Lazy<T>
в каждого потребителя, так как это позволяет общему коду приложения не обращать внимания на тот факт, что существует механизм задержки создания (и ваш код приложения, и тестовый код становятся все более сложными, когда вы делаете это).
Глава 8 Внедрение зависимостей: принцип, практика, шаблоны содержит более подробное обсуждение ленивых и виртуальных прокси.
Однако Lazy<T>
просто потребляет 20 байтов памяти (и еще 24 байта для его обернутого Func<T>
, предполагая 32-битный процесс), и создание экземпляра Lazy<T>
практически бесплатно. Так что об этом не нужно беспокоиться, кроме случаев, когда вы находитесь в среде с очень жесткими ограничениями памяти.
И если потребление памяти является проблемой, попробуйте зарегистрировать сервисы с временем жизни, превышающим переходный. Вы можете сделать за запрос, за веб-запрос или синглтон. Я бы даже сказал, что когда вы находитесь в среде, где создание новых объектов является проблемой, вам, вероятно, следует использовать только одноэлементные сервисы (но вряд ли вы работаете в такой среде, поскольку вы ' перестройка веб-приложения).
Обратите внимание, что Ninject - одна из медленных DI-библиотек для .NET. Если вас это беспокоит, переключитесь на более быстрый контейнер. Некоторые контейнеры имеют производительность, близкую к обновлению графов объектов вручную. но, во что бы то ни стало, при профиле этого многие разработчики переключают библиотеки DI по неправильным причинам.
Обратите внимание, что использование Lazy<T>
в качестве зависимости является неплотной абстракцией (нарушение принципа инверсии зависимости). Пожалуйста, прочитайте этот ответ для получения дополнительной информации.