Я использую CastleWindsor в качестве своей среды внедрения зависимостей, и все это хорошо работает, когда вы находитесь в контроллере, потому что мы можем использовать внедрение конструктора с controllerfactory.
Но есть некоторые конкретные случаи, когда внедрение зависимостей (внедрение конструктора) не будет работать. Например: я хочу иметь возможность разрешать свои зависимости по-прежнему с помощью IOC в некоторых служебных классах или методах расширения (например, HtmlHelper) в моих представлениях. Я знаю, что некоторые люди не согласятся с этим и предпочли бы оставить свои взгляды глупыми, но давайте не будем обсуждать это.
Таким образом, это в основном оставляет мне один вариант, и это использование... локатора сервисов. Итак, я знаю, что большинство людей считают Service Locator антишаблоном, и я понимаю, почему. Но как разрешить свои зависимости с помощью IOC, если вы не можете использовать внедрение зависимостей? Все, что я знаю, это то, что все же лучше использовать сервисный локатор для IOC, чем не иметь ничего. Я хотел бы избежать шаблона локатора сервисов, но, похоже, не понимаю, как его избежать в некоторых конкретных случаях.
Следующий вопрос... поэтому, даже если вам нравится/не нравится локатор сервисов. Как лучше всего реализовать это с помощью CastleWindsor?
Итак, я предполагаю, что варианты будут такими:
Предоставьте контейнер как глобальный объект (или через какой-либо другой глобальный объект, обертывающий контейнер), который вы можете получить из любого места вашего кода. Затем вы можете просто вызвать методы разрешения и выпуска в контейнере. Одна вещь, которая мне не нравится в этом, это то, что мы должны явно вызывать релиз для временных объектов образа жизни. Если неопытный разработчик этого не сделает, вы получите утечку памяти.
Я также нашел: https://www.nuget.org/packages/CommonServiceLocator.WindsorAdapter и у него много загрузок.. (Тот же принцип, что и вариант 1, но более общий и обертывает контейнер, поэтому вы можете легко поменять инфраструктуру DI) Я просмотрел код и обнаружил, что у адаптера есть только методы для разрешения объектов . Так что я как бы задался вопросом, почему нет метода выпуска. Означает ли это, что у этого пакета есть проблемы с утечкой памяти с временными объектами образа жизни?
Надеюсь, кто-нибудь может дать мне несколько советов по этим вопросам!