Локатор служб (шаблон проєктування) — Вікіпедія
Локатор служб — шаблон проєктування, який інкапсулює логіку отримання сервісів. У деяких випадках цей шаблон є антипатерном.
- Спрощує впровадження залежностей для класу.
- Локатор служб виконує пошук сервісів під час виконання програми, що дозволяє підмінити служби без повторної компіляції, наприклад зчитуючи конфігурації із файлу, або що.
- Дозволяє створювати служби на вимогу.
- Приховує залежності класу, що робить його підтримку не очевидною та ускладнює програму.
- Локатор служб має бути унікальним, але це робить його вузьким місцем, що спричиняє проблеми при розгортанні декількох аплікацій, чи одночасному доступі до нього із кількох потоків.
- Якщо локатор служб отримує налаштування динамічно (наприклад, з файлу), це може привести до не стабільної роботи програми, якщо конфігурацію задано невірно.
- Помилки появляються під час виконання програми, а не під час компіляції, коли можна отримати помилку типізації.
- Появляється залежність від контейнера, а не від необхідного сервісу.
- Важко контролювати час життя залежних служб.
Нехай нам необхідно, створити екземпляр класу. Тоді необхідно передати всі параметри в конструктор.
class HomeController { private readonly IHomeService homeService; private readonly ITimeService timeService; private readonly ILogger logger; public HomeController(IHomeService homeService, ITimeService timeService, ILogger logger) { this.homeService = homeService; this.timeService = timeService; this.logger = logger; } }
Цей шаблон пропонує передати клас-фабрику, яка відповідальна за створення служб, довірити логіку створення конструктору та зменшити кількість його параметрів.
class HomeController { private readonly IHomeService homeService; private readonly ITimeService timeService; private readonly ILogger logger; public HomeController(IServiceProvider serviceProvider) { this.homeService = serviceProvider.GetService<IHomeService>(); this.timeService = serviceProvider.GetService<ITimeService>(); this.logger = serviceProvider.GetService<ILogger>(); } }
Також локатор може бути реалізований у вигляді одинака.
class HomeController { private readonly IHomeService homeService; private readonly ITimeService timeService; private readonly ILogger logger; public HomeController() { this.homeService = Locator.GetService<IHomeService>(); this.timeService = Locator.GetService<ITimeService>(); this.logger = Locator.GetService<ILogger>(); } }
- Шаблони проєктування програмного забезпечення
- Об'єктно-орієнтоване програмування
- Одинак (шаблон проєктування)
- Фабричний метод (шаблон проєктування)
- Інверсія керування
- IoC контейнер
- Реєстр (шаблон проєктування)
- Programming stuff [Архівовано 3 липня 2020 у Wayback Machine.]
- Какое главное отличие Dependency Injection от Service Locator? [Архівовано 21 серпня 2020 у Wayback Machine.]