Заглушка сервісу (англ. Service Stub) — шаблон проєктування, який дозволяє позбутись залежностей від зовнішніх компонентів.
Опис
Часто система залежить від зовнішніх сервісів. Зовнішні сервіси можуть створювати неочікувані проблеми, їх не можна контролювати та підтримувати. Ненадійність зовнішніх ресурсів викликає проблеми в самій аплікації. При цьому розробка уповільнюється також через неможливість тестувати логіку аплікації.
Рішенням буде робити залежність не на зовнішній сервіс, а на абстракцію. А при потребі (у разі несправності сервісу, чи тестуванні) використовувати заглушку, цього сервісу, яка виконується локально.
Реалізація
Нехай, наша аплікація містить операції із конвертуванням грошей. Тоді нам необхідний сервіс, який повертатиме курс валют на цю мить. Представимо таку залежність у вигляді абстракцію.
public interface ICurrencyExchange { Task<Money> Convert(Money originalAmount, Currency destinationCurrency); }
Тоді реалізуємо інтерфейси використовуючи необхідний сервіс.
public sealed class CurrencyExchangeService : ICurrencyExchange { private const Uri _exchangeUrl = new Uri("https://api.exchangeratesapi.io/latest?base=USD"); private readonly IHttpClient _httpClient; public CurrencyExchangeService(IHttpClient httpClient) { _httpClient = httpClient; } public async Task<Money> Convert(Money originalAmount, Currency destinationCurrency) { var response = await _httpClient.GetAsync(_exchangeUrl); var usdRates = await response.ReadAsAsync<CurrencyMap>(); decimal usdAmount = usdRates[originalAmount.Currency] / originalAmount.Amount; decimal destinationAmount = usdRates[destinationCurrency] / usdAmount; return new Money(destinationAmount, destinationCurrency); } }
Та щоб уникнути залежності на зовнішній ресурс, напишемо заглушку, яку будемо використовувати при тестах.
public sealed class CurrencyExchangeStub : ICurrencyExchange { private readonly Dictionary<Currency, decimal> _usdRates = new Dictionary<Currency, decimal> { [Currency.Dollar] = 1m, [Currency.Euro] = 0.89021m, }; public Task<Money> Convert(Money originalAmount, Currency destinationCurrency) { decimal usdAmount = this._usdRates[originalAmount.Currency] / originalAmount.Amount; decimal destinationAmount = this._usdRates[destinationCurrency] / usdAmount; var money = new Money(destinationAmount, destinationCurrency) return Task.FromResult(money); } }
Зв'язок з іншими патернами
- Макет об'єкта та заглушка сервісу часто плутають. Та варто розуміти, що макет об'єкта використовуються для імітації поведінки однієї чи декількох функцій та залежно від умов ця імітація може відрізнятись в той час, як заглушка сервісу замінює цілий сервіс та його реалізація залишається незмінною.
Див. також
Джерела
- Service Stub [ 18 серпня 2020 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Zaglushka servisu angl Service Stub shablon proyektuvannya yakij dozvolyaye pozbutis zalezhnostej vid zovnishnih komponentiv OpisChasto sistema zalezhit vid zovnishnih servisiv Zovnishni servisi mozhut stvoryuvati neochikuvani problemi yih ne mozhna kontrolyuvati ta pidtrimuvati Nenadijnist zovnishnih resursiv viklikaye problemi v samij aplikaciyi Pri comu rozrobka upovilnyuyetsya takozh cherez nemozhlivist testuvati logiku aplikaciyi Rishennyam bude robiti zalezhnist ne na zovnishnij servis a na abstrakciyu A pri potrebi u razi nespravnosti servisu chi testuvanni vikoristovuvati zaglushku cogo servisu yaka vikonuyetsya lokalno RealizaciyaNehaj nasha aplikaciya mistit operaciyi iz konvertuvannyam groshej Todi nam neobhidnij servis yakij povertatime kurs valyut na cyu mit Predstavimo taku zalezhnist u viglyadi abstrakciyu public interface ICurrencyExchange Task lt Money gt Convert Money originalAmount Currency destinationCurrency Todi realizuyemo interfejsi vikoristovuyuchi neobhidnij servis public sealed class CurrencyExchangeService ICurrencyExchange private const Uri exchangeUrl new Uri https api exchangeratesapi io latest base USD private readonly IHttpClient httpClient public CurrencyExchangeService IHttpClient httpClient httpClient httpClient public async Task lt Money gt Convert Money originalAmount Currency destinationCurrency var response await httpClient GetAsync exchangeUrl var usdRates await response ReadAsAsync lt CurrencyMap gt decimal usdAmount usdRates originalAmount Currency originalAmount Amount decimal destinationAmount usdRates destinationCurrency usdAmount return new Money destinationAmount destinationCurrency Ta shob uniknuti zalezhnosti na zovnishnij resurs napishemo zaglushku yaku budemo vikoristovuvati pri testah public sealed class CurrencyExchangeStub ICurrencyExchange private readonly Dictionary lt Currency decimal gt usdRates new Dictionary lt Currency decimal gt Currency Dollar 1 m Currency Euro 0 89021 m public Task lt Money gt Convert Money originalAmount Currency destinationCurrency decimal usdAmount this usdRates originalAmount Currency originalAmount Amount decimal destinationAmount this usdRates destinationCurrency usdAmount var money new Money destinationAmount destinationCurrency return Task FromResult money Zv yazok z inshimi paternamiMaket ob yekta ta zaglushka servisu chasto plutayut Ta varto rozumiti sho maket ob yekta vikoristovuyutsya dlya imitaciyi povedinki odniyeyi chi dekilkoh funkcij ta zalezhno vid umov cya imitaciya mozhe vidriznyatis v toj chas yak zaglushka servisu zaminyuye cilij servis ta jogo realizaciya zalishayetsya nezminnoyu Div takozhMaket ob yektaDzherelaService Stub 18 serpnya 2020 u Wayback Machine