在asp.net核心中,我正在注册键入的HttpClient
,我需要来自服务提供商的解决服务。我该如何解决那里的服务?
示例:
services
.AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>(httpClient =>
{
// how to resolve service on next line?
var config = RESOLVE_SERVICE<IConfig>();
httpClient.BaseAddress = config.GetBaseUrl();
});
答案 0 :(得分:0)
我假设实际的问题是注册类型化的HttpClient和HttpContext(特定HTTP请求的上下文)不相关时如何访问配置或任何其他服务。
更新在.NET Core 2.1中,尽管文档显示,AddHttpClient的两个类型参数和一个IServiceCollection
都没有重载。通过在AddHttpClient之后对ConfigureHttpClient
进行校准,可以执行相同的工作。
services
.AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>()
.ConfigureHttpClient(svc,httpClient =>
{
// how to resolve service on next line?
var config = svc.GetRequiredService<IConfig>();
httpClient.BaseAddress = config.GetBaseUrl();
});
原始
您可以使用AddHttpClient(IServiceCollection, String, Action< IServiceProvider,HttpClient>)重载将IServiceProvider
传递给可用于解决其他服务的操作:
services
.AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>((svc,httpClient =>
{
// how to resolve service on next line?
var config = svc.GetRequiredService<IConfig>();
httpClient.BaseAddress = config.GetBaseUrl();
});
我建议阅读史蒂夫·戈登(Steve Gordon)关于类型HttpClients和HttpClientFactory的文章系列。 Using Typed Clients from Singleton Services显示了如何使用AddHttpClient
来配置客户端。他的其余文章展示了如何使用HttpClientFactory和Polly对其进行配置,以进行正确的缓冲和重试
配置
Steve Gordon的示例使用IOption从配置基础结构读取数据。
services.AddHttpClient<IConfigurationService, ConfigurationService>()
.ConfigureHttpClient((serviceProvider, client) =>
{
var baseAddress = serviceProvider.GetRequiredService<IOptions<SdkOptions>>().Value.BaseAddress;
client.BaseAddress = new Uri(baseAddress);
});
这是一个好主意-HttpClient注册不应该也不应该依赖于其配置值的来源。 IConfig
应该只不过是在配置阶段加载的配置DTO。
.NET Core配置可以从json / xml / ini文件,数据库,外部服务,环境变量以及任何可以以"section:subsection" - value
形式返回值的内容中加载值。它还允许组合和重载设置,这可能非常有用。
我有一些应用程序可以从文件(基本配置),由其他团队管理的数据库(外部服务端点和凭据)和命令行(可能的替代)中加载设置。端点配置用于创建N个名为HttpClients,每个端点一个。我使用this example创建了一个可加载端点设置的EF Core提供程序。
这也允许在应用程序启动时验证设置,这可能是一个很大的好处。没有它,在第一次请求特定的HttpClient之前,应用程序不会知道出了什么问题。