Внедрение одного типа интерфейса HttpCliejt из нескольких типов HttpClient - PullRequest
0 голосов
/ 31 марта 2020

У меня есть следующий класс:

public class RestRepository<TDbRecord> : IRepository<TDbRecord> where TDbRecord : class
    {
        #region Fields
        private readonly HttpClient _httpClient;
        #endregion

        #region ctor
        public RestRepository(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }
        #endregion
        ...
    }

В интерфейсе есть несколько действий, которые необходимо выполнить с помощью HTTP-запросов (Get, GetSpecifi c Post, Post List…).

В сервисе запуска я настраиваю некоторые HttpClient с разными базовыми адресами, например:

services.AddHttpClient<IRepository<TDbRecordClassA>>(client => client.BaseAddress = new Uri(baseAddress, "api/ClassA"));
services.AddHttpClient<IRepository<TDbRecordClassB>>(client => client.BaseAddress = new Uri(baseAddress, "api/ClassB"));
services.AddHttpClient<IRepository<TDbRecordClassC>>(client => client.BaseAddress = new Uri(baseAddress, "api/ClassC"));
services.AddHttpClient<IRepository<TDbRecordClassD>>(client => client.BaseAddress = new Uri(baseAddress, "api/ClassD"));

Ранее я определял их как одиночные, конструировал классы при запуске и вставлял их другим классы:

public ClassDActionsHandler(<IRepository<TDbRecordClassD>)… 

Однако теперь использование AddHttpClient() без конструирования класса во время запуска дает мне следующее исключение при попытке ввести класс:

Исключение при запуске приложения System.Exception: Не удалось разрешить службу типа 'xyIClassDActionsHandler' для параметра 'ClassDActionsHandler' метода 'Configure' для типа 'x.Startup'. ---> System.InvalidOperationException: подходящий конструктор для типа 'x.DAL.IRepository 1[x.y.z.x.y.z.TDbRecordClassD]' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor. at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.FindApplicableConstructor(Type instanceType, Type[] argumentTypes, ConstructorInfo& matchingConstructor, Nullable 1 [] & parameterMap) в Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateFactory (Type instanceType, Type [] argumentsTypes) в Microsoft. Extensions.Http.DefaultTypedHttpClientFactory 1.Cache.<>c.<.cctor>b__7_0() at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func 1 valueFactory) в Майкрософт , Аргумент TArgument) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient (область действия TransientCallSite transientCallSite, ServiceProviderEngineScope) в объекте Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteSiteSiteSiteSiteSiteSiteSiteVite .DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite scoped CallSite, область ServiceProviderEngineScope) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton (SingletonCallSite singletonCallSite, ServiceProviderEngineScope) в Майкрософт Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (scopedCallSite scopedCallSite, ServiceProviderEngineScope сфера) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton (SingletonCallSite singletonCallSite, ServiceProviderEngineScope охват) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite ( IServiceCallSite callSite, аргумент TArgument) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve (IServiceCallSite callSite, ServiceProviderEngineScope) в Microsoft.Extensions.Depende ncyInjection.ServiceLookup.DynamicServiceProviderEngine. <> c__DisplayClass1_0.b__0 (ServiceProviderEngineScope сфера) в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService (тип ServiceType, ServiceProviderEngineScope serviceProviderEngineScope) в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService (тип ServiceType) в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (поставщик IServiceProvider, Тип serviceType) в Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke (экземпляр объекта, построитель IApplicationBuilder) - конец трассировки внутреннего исключения .AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke (Экземпляр объекта, построитель IApplicationBuilder) в Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder. <> C__DisplayClass4_0.b__0 (построитель IApplicationBuilder) в Microsoft.Ast. Настроить (приложение IApplicationBuilder) в Microsoft.AspNetCore. Mvc .Internal.MiddlewareFilterBuilderStartupFilter. <> C__DisplayClass0_0.g__MiddlewareFilterBuilder | 0 (IApplicationBuilder builder) в Microsoft.AspNetCil0. Hosting.Internal.AutoRequestServicesStartupFilter. <> C__DisplayClass0_0.b__0 (построитель IApplicationBuilder) в Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication ()

1 Ответ

0 голосов
/ 31 марта 2020

Я думаю, вам нужно изменить регистрационный код службы на следующий:

services.AddHttpClient<IRepository<TDbRecordClassA>, RestRepository<TDbRecordClassA>> (client => client.BaseAddress = new Uri(baseAddress, "api/ClassA"));
services.AddHttpClient<IRepository<TDbRecordClassB>, RestRepository<TDbRecordClassB>> (client => client.BaseAddress = new Uri(baseAddress, "api/ClassB"));
services.AddHttpClient<IRepository<TDbRecordClassC>, RestRepository<TDbRecordClassC>> (client => client.BaseAddress = new Uri(baseAddress, "api/ClassC"));
services.AddHttpClient<IRepository<TDbRecordClassD>, RestRepository<TDbRecordClassD>> (client => client.BaseAddress = new Uri(baseAddress, "api/ClassD"));
...