Локатор служб (шаблон проєктування) — Вікіпедія

Локатор служб — шаблон проєктування, який інкапсулює логіку отримання сервісів. У деяких випадках цей шаблон є антипатерном.

Переваги та недоліки

[ред. | ред. код]

Переваги

[ред. | ред. код]
  • Спрощує впровадження залежностей для класу.
  • Локатор служб виконує пошук сервісів під час виконання програми, що дозволяє підмінити служби без повторної компіляції, наприклад зчитуючи конфігурації із файлу, або що.
  • Дозволяє створювати служби на вимогу.

Недоліки

[ред. | ред. код]
  • Приховує залежності класу, що робить його підтримку не очевидною та ускладнює програму.
  • Локатор служб має бути унікальним, але це робить його вузьким місцем, що спричиняє проблеми при розгортанні декількох аплікацій, чи одночасному доступі до нього із кількох потоків.
  • Якщо локатор служб отримує налаштування динамічно (наприклад, з файлу), це може привести до не стабільної роботи програми, якщо конфігурацію задано невірно.
  • Помилки появляються під час виконання програми, а не під час компіляції, коли можна отримати помилку типізації.
  • Появляється залежність від контейнера, а не від необхідного сервісу.
  • Важко контролювати час життя залежних служб.

Опис мовою C#

[ред. | ред. код]

Нехай нам необхідно, створити екземпляр класу. Тоді необхідно передати всі параметри в конструктор.

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>();    } } 

Див. також

[ред. | ред. код]

Джерела

[ред. | ред. код]