0
votes

I have the following class:

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
        ...
    }

The interface has multiple actions that need be executed via HTTP requests (Get, GetSpecific Post, Post List…).

In the startup service, I am configuring some ‘HttpClient`s with different base addresses, like this:

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"));

Previously, I would define them as singletons, construct the classes at startup, and inject them to other classes:

public ClassDActionsHandler(<IRepository<TDbRecordClassD>)… 

Now, however, using AddHttpClient() without constructing the class during startup gives me the following exception when I try to inject the class:

Application startup exception System.Exception: Could not resolve a service of type 'x.y.IClassDActionsHandler' for the parameter 'ClassDActionsHandler' of method 'Configure' on type 'x.Startup'. ---> System.InvalidOperationException: A suitable constructor for type 'x.DAL.IRepository1[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, Nullable1[]& parameterMap) at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateFactory(Type instanceType, Type[] argumentTypes) at Microsoft.Extensions.Http.DefaultTypedHttpClientFactory1.Cache.<>c.<.cctor>b__7_0() at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func1 valueFactory) at Microsoft.Extensions.Http.DefaultTypedHttpClientFactory1.Cache.get_Activator() at Microsoft.Extensions.Http.DefaultTypedHttpClientFactory1.CreateClient(HttpClient httpClient) at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.<>c__DisplayClass9_01.<AddTypedClient>b__0(IServiceProvider s) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(IServiceCallSite callSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.b__0(ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) --- End of inner exception stack trace --- at Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder) at Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder) at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app) at Microsoft.AspNetCore.Mvc.Internal.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder) at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app) at Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder builder) at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()

1

1 Answers

0
votes

I think you need to change your service registration code to the following:

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"));