Reputation: 13
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.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) 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, Func
1 valueFactory) at Microsoft.Extensions.Http.DefaultTypedHttpClientFactory1.Cache.get_Activator() at Microsoft.Extensions.Http.DefaultTypedHttpClientFactory
1.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.CallSiteVisitor
2.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.CallSiteVisitor
2.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.CallSiteVisitor
2.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()
Upvotes: 0
Views: 807
Reputation: 1970
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"));
Upvotes: 1