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

Когда вы будете использовать Common Service Locator?

Я смотрел Common Service Locator как способ абстрагирования моего контейнера IoC, но я заметил, что некоторые люди сильно против этого типа этого.

Рекомендуют ли люди никогда не использовать его? Всегда использовать его? или иногда использовать его? Если иногда, то в каких ситуациях вы будете использовать его и какие бы ситуации вы его не использовали.

4b9b3361

Ответ 1

Представьте, что вы пишете библиотечный код, который будет использоваться сторонними разработчиками. Ваш код должен иметь возможность создавать объекты обслуживания, предоставляемые этими разработчиками. Однако вы не знаете, какой контейнер IoC будет использовать каждый из ваших абонентов.

Общедоступный локатор сервисов позволяет вам справиться с вышеуказанным, не нажимая на пользователя IOC.

В самой библиотеке вы можете захотеть зарегистрировать свои собственные классы в IoC, теперь это становится намного сложнее, так как вам нужно выбрать IoC для вашего собственного использования, которое не будет мешать вашим абонентам.

Ответ 2

Я заметил, что один из аргументов против использования CSL является ложным, потому что разработчики считают, что эта библиотека способна выполнять шаблон Service Locator. Однако это не так, потому что его легко использовать с шаблоном Injection Dependency.

Однако библиотека CSL была специально разработана для дизайнеров фреймворков, которым необходимо разрешить пользователям регистрировать зависимости. Поскольку библиотека будет вызывать CSL напрямую, с точки зрения структуры мы говорим о шаблоне SL, отсюда и его название.

Однако, как разработчик фреймворка, зависимость от CSL не должна восприниматься легкомысленно. Для удобства использования вашей структуры обычно гораздо лучше иметь свой собственный механизм DI. Очень распространенным механизмом является настройка зависимостей в файле конфигурации. Этот шаблон используется во всей платформе .NET. Почти каждая зависимость может быть заменена на другую. Шаблон поставщика .NET построен поверх этого.

Когда вы, как разработчик фреймворка, зависте от CSL, пользователям будет сложно использовать ваше приложение. Пользователям придется настроить контейнер IoC и подключить его к CSL. Тем не менее, фреймворк не может проверить конфигурацию, как это можно сделать при использовании системы конфигурации .NET, которая, как и всякая поддержка валидации, в ней.

Ответ 3

В последнее время я кое-что прочитал в концепции локатора сервиса. Это способ уменьшить сцепление, но требует связывания кода с локатором, а не с контейнером, поддерживающим локатор, но сам локатор. Это компромисс, но может быть полезен в правильной ситуации.

Одна из ситуаций, когда это может быть полезно, - это когда у вас есть код, который не использует DI, например устаревший код. Сейчас я нахожусь в этой лодке. Вытягивание требуемых объектов через SL, а не прямое их создание, позволяет добавить некоторую абстракцию. Я рассматриваю это как промежуточный шаг между SL и DI/IoC.

Ответ 4

Если у вас есть код библиотеки, который нуждается в услугах, и этот код может быть размещен в контексте более крупной структуры/времени выполнения, тогда среда/среда выполнения должна будет обеспечить механизм, в котором вы можете запускать какой-то пользовательский код при запуске, где вы можете инициализировать свои контейнеры и регистрировать зависимости. Хорошим примером того, где CSL может быть проблематично, является использование его в контексте MSCRM. Вы можете создать пользовательскую бизнес-логику, зарегистрировав плагины, которые среда MSCRM выполняет на определенных событиях. Проблема, с которой вы столкнулись, заключается в том, где вы запускаете логику регистрации, поскольку нет события "запуска", которое вы можете подписаться на настройку вашего контейнера DI. Даже если бы вы могли каким-то образом настроить свой DI, вам нужно будет поместить библиотеки CSL и DI в GAC, поскольку это единственный способ вызвать сторонний код из плагина (еще один элемент для добавления в контрольный список развертывания). В таких сценариях вам лучше иметь свои зависимости в качестве параметров конструктора, которые вызывающий код может инициализировать по своему усмотрению (с помощью либо впрыска конструктора, либо вручную "приступая к реализации" соответствующей реализации интерфейса).