diff options
author | Serghei Cebotari <serghei@cebotari.ru> | 2024-01-18 23:16:27 +0300 |
---|---|---|
committer | Serghei Cebotari <serghei@cebotari.ru> | 2024-01-18 23:16:27 +0300 |
commit | fe58c854ea7d9ef64d943876f62c09168aabeff5 (patch) | |
tree | 2508229b664df3800f12f237d0f05991a5bf3211 | |
parent | 822398e2867b3494296a87139035ee17ee0f6c30 (diff) |
Add memory cache to currency client
-rw-r--r-- | RhSolutions.AddIn/Services/CurrencyClient.cs | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/RhSolutions.AddIn/Services/CurrencyClient.cs b/RhSolutions.AddIn/Services/CurrencyClient.cs index e959bfa..f71d55a 100644 --- a/RhSolutions.AddIn/Services/CurrencyClient.cs +++ b/RhSolutions.AddIn/Services/CurrencyClient.cs @@ -1,4 +1,5 @@ -using System.Net; +using Microsoft.Extensions.Caching.Memory; +using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Xml.Linq; @@ -8,34 +9,42 @@ namespace RhSolutions.Services; public class CurrencyClient : ICurrencyClient { private readonly HttpClient _httpClient; + private readonly IMemoryCache _memoryCache; private const string _requestAddress = @"https://www.cbr.ru/scripts/XML_daily.asp?date_req="; public HttpStatusCode StatusCode { get; private set; } - public CurrencyClient(HttpClient httpClient) + public CurrencyClient(HttpClient httpClient, IMemoryCache memoryCache) { _httpClient = httpClient; + _memoryCache = memoryCache; } public async Task<decimal?> GetExchangeRate(DateTime date) { - string request = $"{_requestAddress}{date.Date:dd/MM/yyyy}"; - HttpResponseMessage response = await _httpClient.GetAsync(request); - try + if (!_memoryCache.TryGetValue(date, out decimal exchangeRate)) { - response.EnsureSuccessStatusCode(); - string xml = await response.Content.ReadAsStringAsync(); - XElement valCourses = XElement.Parse(xml); - - decimal? exchangeRate = decimal.Parse(valCourses.Elements("Valute") - .Where(e => e.Element("Name").Value == "Евро") - .FirstOrDefault() - .Element("Value").Value); - return exchangeRate; - } - catch - { - StatusCode = response.StatusCode; - return null; + string request = $"{_requestAddress}{date.Date:dd/MM/yyyy}"; + HttpResponseMessage response = await _httpClient.GetAsync(request); + try + { + response.EnsureSuccessStatusCode(); + string xml = await response.Content.ReadAsStringAsync(); + XElement valCourses = XElement.Parse(xml); + exchangeRate = decimal.Parse(valCourses.Elements("Valute") + .Where(e => e.Element("Name").Value == "Евро") + .FirstOrDefault() + .Element("Value").Value); + var cacheEntryOptions = new MemoryCacheEntryOptions() + .SetSlidingExpiration(TimeSpan.FromHours(1)); + _memoryCache.Set(date, exchangeRate, cacheEntryOptions); + return exchangeRate; + } + catch + { + StatusCode = response.StatusCode; + return null; + } } + return exchangeRate; } }
\ No newline at end of file |