Локатор служб (шаблон проєктування): відмінності між версіями
Перейти до навігації
Перейти до пошуку
[неперевірена версія] | [неперевірена версія] |
Вилучено вміст Додано вміст
Немає опису редагування |
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 контейнер|клас-фабрику]], яка відповідальна за створення [[Патерн сервісного рівня|служб]], довірити логіку створення конструктору та зменшити кількість його параметрів. |
|||
{{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
Локатор служб — шаблон проєктування, який інкапсулює логіку отримання сервісів. У деяких випадках цей шаблон є антипатерном.
- Спрощує впровадження залежностей для класу.
- Локатор служб виконує пошук сервісів під час виконання програми, що дозволяє підмінити служби без повторної компіляції, наприклад зчитуючи конфігурації із файлу, або що.
- Дозволяє створювати служби на вимогу.
- Приховує залежності класу, що робить його підтримку не очевидною та ускладнює програму.
- Локатор служб має бути унікальним, але це робить його вузьким місцем, що спричиняє проблеми при розгортанні декількох аплікацій, чи одночасному доступі до нього із кількох потоків.
- Якщо локатор служб отримує налаштування динамічно (наприклад, з файлу), це може привести до не стабільної роботи програми, якщо конфігурацію задано невірно.
- Помилки появляються під час виконання програми, а не під час компіляції, коли можна отримати помилку типізації.
- Появляється залежність від контейнера, а не від необхідного сервісу.
- Важко контролювати час життя залежних служб.
Нехай нам необхідно, створити екземпляр класу. Тоді необхідно передати всі параметри в конструктор.
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.]