Пересылка экземпляров универсального интерфейса в другой универсальный интерфейс - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть универсальный интерфейс 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<???>());
...