在HttpContext中解析服务配置操作

时间:2018-11-08 12:34:06

标签: .net asp.net-core dependency-injection .net-core dotnet-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();
    });

1 个答案:

答案 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之前,应用程序不会知道出了什么问题。