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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
Asketbouncer (обговорення | внесок)
Немає опису редагування
Altegar (обговорення | внесок)
мНемає опису редагування
Мітка: редагування коду 2017
 
(Не показана 1 проміжна версія ще одного користувача)
Рядок 1: Рядок 1:
'''Локатор служб''' — [[Шаблони проєктування програмного забезпечення|шаблон проєктування]], який інкапсулює логіку отримання [[Патерн сервісного рівня|сервісів]]. В деяких випадках даний шаблон є [[антипатерн]]ом.
'''Локатор служб''' — [[Шаблони проєктування програмного забезпечення|шаблон проєктування]], який інкапсулює логіку отримання [[Патерн сервісного рівня|сервісів]]. У деяких випадках цей шаблон є [[антипатерн]]ом.


== Переваги та недоліки ==
== Переваги та недоліки ==
Рядок 13: Рядок 13:
* Приховує залежності класу, що робить його підтримку не очевидною та ускладнює програму.
* Приховує залежності класу, що робить його підтримку не очевидною та ускладнює програму.
* Локатор служб має бути [[Одинак (шаблон проєктування)|унікальним]], але це робить його вузьким місцем, що спричиняє проблеми при розгортанні декількох аплікацій, чи одночасному доступі до нього із кількох потоків.
* Локатор служб має бути [[Одинак (шаблон проєктування)|унікальним]], але це робить його вузьким місцем, що спричиняє проблеми при розгортанні декількох аплікацій, чи одночасному доступі до нього із кількох потоків.
* Якщо локатор служб отримує налаштування динамічно (наприклад, із файлу), це може привести до не стабільної роботи програми, якщо конфігурацію задано невірно.
* Якщо локатор служб отримує налаштування динамічно (наприклад, з файлу), це може привести до не стабільної роботи програми, якщо конфігурацію задано невірно.
* Помилки появляються під час виконання програми, а не під час компіляції, коли можна отримати помилку типізації.
* Помилки появляються під час виконання програми, а не під час компіляції, коли можна отримати помилку типізації.
* Появляється залежність від [[IoC контейнер|контейнера]], а не від необхідного сервісу.
* Появляється залежність від [[IoC контейнер|контейнера]], а не від необхідного сервісу.
Рядок 20: Рядок 20:
== Опис мовою [[C Sharp|C#]] ==
== Опис мовою [[C Sharp|C#]] ==


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


{{syntaxhighlight|lang=csharp|1=
{{syntaxhighlight|lang=csharp|1=
Рядок 38: Рядок 38:
}}
}}


Даний шаблон пропонує передати [[IoC контейнер|клас-фабрику]], яка відповідальна за створення [[Патерн сервісного рівня|служб]], довірити логіку створення конструктору та зменшити кількість його параметрів.
Цей шаблон пропонує передати [[IoC контейнер|клас-фабрику]], яка відповідальна за створення [[Патерн сервісного рівня|служб]], довірити логіку створення конструктору та зменшити кількість його параметрів.


{{syntaxhighlight|lang=csharp|1=
{{syntaxhighlight|lang=csharp|1=
Рядок 79: Рядок 79:
* [[Одинак (шаблон проєктування)]]
* [[Одинак (шаблон проєктування)]]
* [[Фабричний метод (шаблон проєктування)]]
* [[Фабричний метод (шаблон проєктування)]]
* [[Інверсія управління]]
* [[Інверсія керування]]
* [[IoC контейнер]]
* [[IoC контейнер]]
* [[Реєстр (шаблон проєктування)]]
* [[Реєстр (шаблон проєктування)]]


== Джерела ==
== Джерела ==
* [http://sergeyteplyakov.blogspot.com/2013/03/di-service-locator.html Programming stuff]
* [http://sergeyteplyakov.blogspot.com/2013/03/di-service-locator.html Programming stuff] {{Webarchive|url=https://web.archive.org/web/20200703190753/http://sergeyteplyakov.blogspot.com/2013/03/di-service-locator.html |date=3 липня 2020 }}
* [https://habr.com/ru/post/465395/ Какое главное отличие Dependency Injection от Service Locator?]
* [https://habr.com/ru/post/465395/ Какое главное отличие Dependency Injection от Service Locator?] {{Webarchive|url=https://web.archive.org/web/20200821122738/https://habr.com/ru/post/465395/ |date=21 серпня 2020 }}


{{Шаблони проєктування ПЗ}}
{{Шаблони проєктування ПЗ}}

Поточна версія на 16:54, 12 квітня 2023

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

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

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

Переваги

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

Недоліки

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

Опис мовою 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>();
   }
}

Див. також

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

Джерела

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