У меня есть универсальный интерфейс IApiService, отвечающий за вызовы GET на другой сервер.У меня есть три требования:
- некоторые использования должны быть кэшированы
- некоторые использования никогда не должны кэшироваться
- некоторые использования не заботятся о кэшировании и должны иметь значение по умолчаниюпараметр, который можно легко изменить
Моя идея заключалась в том, чтобы ввести следующую иерархию:
public interface IApiService<T> where T : class
{
Task<T> GetAsync(IRequestParameters requestParameters);
}
public interface ICachedApiService<T> : IApiService<T> where T : class
{
}
public interface IDirectApiService<T> : IApiService<T> where T : class
{
}
Для случая 1 я использую ICachedApiService , для случая 2 IЯ использую IDirectApiService , а для случая 3 я использую IApiService .
Я использую .NET Core среду внедрения зависимостей по умолчанию.И вот моя конфигурация для ICachedApiService :
serviceCollection.AddScoped(typeof(ICachedApiService<>), typeof(CachedApiService<>);
Для IDirectApiService Это отличается, и я должен использовать лямбда-метод для каждого универсального типа
serviceCollection.AddScoped<IDirectApiService<ProductDTO>>(serviceProvider => new
DirectApiService<ProductDTO> (
ProductsEndpoint // and other type specific data
));
Вопрос в том, как настроить IApiService на использование IDirectApiService или ICachedApiService ?Для ICachedApiService это просто:
serviceCollection.AddScoped(typeof(IApiService<>), typeof(CachedApiService<>));
Для IDirectApiService Я бы предпочел не повторять конфигурацию для каждого конкретного типа, так как это подвержено ошибкам и требует дополнительных изменений, еслиЯ хочу перейти на кешированную версию.Возможно ли это с какой-либо структурой внедрения зависимостей?Есть ли способ как-то получить универсальный параметр, который отсутствует в getService?
serviceCollection.AddScoped(typeof(IApiService<>), x => x.GetService<???>());