【问题标题】:Injecting a single HttpClient Interface type from multiple HttpClient types从多个 HttpClient 类型注入单个 HttpClient 接口类型
【发布时间】:2020-03-31 18:52:14
【问题描述】:

我有以下课程:

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、GetSpecific 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:无法为“x.Startup”类型的“Configure”方法的参数“ClassDActionsHandler”解析“x.y.IClassDActionsHandler”类型的服务。 ---> System.InvalidOperationException:适用于类型 '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) 的构造函数 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateFactory(类型 instanceType,Type[] argumentTypes) 在 Microsoft.Extensions.Http.DefaultTypedHttpClientFactory1.Cache.<>c.<.cctor>b__7_0() at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func1 valueFactory) 在 Microsoft.Extensions.Http.DefaultTypedHttpClientFactory1.Cache.get_Activator() at Microsoft.Extensions.Http.DefaultTypedHttpClientFactory1.CreateClient(HttpClient httpClient) 在 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 参数) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite,ServiceProviderEngineScope 范围) 在 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 参数) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,ServiceProviderEngineScope 范围) 在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite,ServiceProviderEngineScope 范围) 在 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 参数) 在 Microsoft.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.DependencyInjection.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 构建器) --- 内部异常堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(对象实例,IApplicationBuilder 构建器) 在 Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.c__DisplayClass4_0.b__0(IApplicationBuilder 生成器) 在 Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder 应用程序) 在 Microsoft.AspNetCore.Mvc.Internal.MiddlewareFilterBuilderStartupFilter.c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder 构建器) 在 Microsoft.AspNetCore.HostFilteringStartupFilter.c__DisplayClass0_0.b__0(IApplicationBuilder 应用程序) 在 Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter.c__DisplayClass0_0.b__0(IApplicationBuilder 生成器) 在 Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()

【问题讨论】:

    标签: asp.net-core dependency-injection httpclient


    【解决方案1】:

    我认为您需要将您的服务注册码更改为以下内容:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2016-04-08
      • 2019-05-12
      相关资源
      最近更新 更多