在 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 时才会知道出了什么问题。