在 HttpContext 配置 Action 中解析服务
Resolve service in HttpContext configure Action
在 asp.net 核心中,我正在注册类型 HttpClient
,我需要服务提供商的解析服务。我如何解决那里的服务?
示例:
services
.AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>(httpClient =>
{
// how to resolve service on next line?
var config = RESOLVE_SERVICE<IConfig>();
httpClient.BaseAddress = config.GetBaseUrl();
});
我假设实际问题是在注册类型化 HttpClient 和 HttpContext(特定 HTTP 请求的上下文)时如何访问配置或任何其他服务不相关。
UPDATE 在 .NET Core 2.1 中,AddHttpClient 没有 two 类型参数和 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 关于类型化 HttpClient 和 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 文件、数据库、外部服务、环境变量以及任何可以 return 形式的 "section:subsection" - value
值加载值。它还允许组合和重载设置,这可能非常有用。
我有一些应用程序可以从文件(基本配置)、其他团队管理的数据库(外部服务端点和凭据)和命令行(可能的覆盖)加载设置。端点配置用于创建 N 个命名的 HttpClient,每个端点一个。我使用 this example 创建了一个加载端点设置的 EF Core 提供程序。
这也允许在应用程序启动时验证设置,这是一个很大的好处。没有它,应用程序直到第一次请求特定的 HttpClient 时才会知道出了什么问题。
在 asp.net 核心中,我正在注册类型 HttpClient
,我需要服务提供商的解析服务。我如何解决那里的服务?
示例:
services
.AddHttpClient<TTypedHttpClient, TTypedHttpClientImpl>(httpClient =>
{
// how to resolve service on next line?
var config = RESOLVE_SERVICE<IConfig>();
httpClient.BaseAddress = config.GetBaseUrl();
});
我假设实际问题是在注册类型化 HttpClient 和 HttpContext(特定 HTTP 请求的上下文)时如何访问配置或任何其他服务不相关。
UPDATE 在 .NET Core 2.1 中,AddHttpClient 没有 two 类型参数和 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 关于类型化 HttpClient 和 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 文件、数据库、外部服务、环境变量以及任何可以 return 形式的 "section:subsection" - value
值加载值。它还允许组合和重载设置,这可能非常有用。
我有一些应用程序可以从文件(基本配置)、其他团队管理的数据库(外部服务端点和凭据)和命令行(可能的覆盖)加载设置。端点配置用于创建 N 个命名的 HttpClient,每个端点一个。我使用 this example 创建了一个加载端点设置的 EF Core 提供程序。
这也允许在应用程序启动时验证设置,这是一个很大的好处。没有它,应用程序直到第一次请求特定的 HttpClient 时才会知道出了什么问题。