Как я могу упростить классы, которые делают похожие вещи - PullRequest
0 голосов
/ 12 июля 2020

Я работаю над проектом, в котором я вызываю внешний API. Я хочу кэшировать ответы API на определенное время и создал 5 классов, которые делают практически одно и то же: получают данные из кеша или, если в кеше нет данных, получают данные из API.

Я ищу предложения, как просто использовать этот код.

Class:

using DataCreator.Foo.Api;
using DataCreator.Foo.Models;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;

namespace DataCreator.Foo.DataProvider
{
    public class PerformanceStatusDataProvider
    {
        private readonly IMemoryCache memoryCache;

        public PerformanceStatusDataProvider(IServiceProvider serviceProvider)
        {
            memoryCache = serviceProvider.GetService<IMemoryCache>();
        }

        public List<PerformanceStatus> GetPerformanceStatuses()
        {
            return memoryCache.GetOrCreate("performance_status", cacheEntry =>
            {
                cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1);
                return FooApi.Instance.GetPerformanceStatuses();

            });
        }
    }
}

1 Ответ

0 голосов
/ 12 июля 2020

Если все ваши DataProvider'ы следуют схожему синтаксису, это должно быть довольно легко с обобщениями:

public List<T> GetData<T>(string cacheKey, Func<List<T>> retrieveDataFromApi)
{
    return memoryCache.GetOrCreate(cacheKey, cacheEntry =>
    {
        cacheEntry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1);

        return retrieveDataFromApi();
    });
}

Вы бы назвали это, используя что-то вроде:

GenericDataProvider.GetData("performance_status", FooApi.Instance.GetPerformanceStatuses);

Небольшие детали: вы вызываете API и не используете async/await (вам, безусловно, следует) и FooApi.Instance - это запах кода, вы на 50% используете Injection Dependency и 50% зависимостей жесткого кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...