gpt4 book ai didi

c# - HttpClientFactory : Typed HttpClient with additional constructor arguments

转载 作者:行者123 更新时间:2023-12-03 13:44:55 24 4
gpt4 key购买 nike

HttpClientFactory我们可以配置依赖注入(inject)来创建和管理 HttpClients 的生命周期:

public class GitHubService : IGitHubService
{
public HttpClient Client { get; }

public GitHubService(HttpClient client)
{
client.BaseAddress = new Uri("https://api.github.com/");
// GitHub API versioning
client.DefaultRequestHeaders.Add("Accept",
"application/vnd.github.v3+json");
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent",
"HttpClientFactory-Sample");

Client = client;
}

public async Task<IEnumerable<GitHubIssue>> GetAspNetDocsIssues()
{
var response = await Client.GetAsync(
"/repos/aspnet/AspNetCore.Docs/issues?state=open&sort=created&direction=desc");

response.EnsureSuccessStatusCode();

using var responseStream = await response.Content.ReadAsStreamAsync();
return await JsonSerializer.DeserializeAsync
<IEnumerable<GitHubIssue>>(responseStream);
}
}

然后在 Startup.cs 我们配置 DI:
services.AddHttpClient<GitHubService>();

但是,如果类型化客户端有额外的构造函数参数,应该如何提供这些?
例如,如果要传入存储库名称:
public class GitHubService : IGitHubService
{
public HttpClient Client { get; }
private readonly string _repositoryName;

public GitHubService(HttpClient client, string repositoryName)
{
_repositoryName = repositoryName;

client.BaseAddress = new Uri("https://api.github.com/");
// GitHub API versioning
client.DefaultRequestHeaders.Add("Accept",
"application/vnd.github.v3+json");
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("User-Agent",
"HttpClientFactory-Sample");

Client = client;
}

public async Task<IEnumerable<GitHubIssue>> GetAspNetDocsIssues()
{
var response = await Client.GetAsync(
$"/repos/aspnet/{_repositoryName}/issues?state=open&sort=created&direction=desc");

response.EnsureSuccessStatusCode();

using var responseStream = await response.Content.ReadAsStreamAsync();
return await JsonSerializer.DeserializeAsync
<IEnumerable<GitHubIssue>>(responseStream);
}
}

也许这不是一个现实的例子,但是如何配置依赖注入(inject)来提供存储库名称?

最佳答案

我设法通过切换到命名客户端来完成这项工作:

//To start with, create a named client:
services.AddHttpClient("GitHubClient", ctx => { ctx.BaseAddress = new Uri("https://api.github.com/"); });

//Then set up DI for the TypedClient
services.AddTransient<IGitHubService>(ctx =>
{
var clientFactory = ctx.GetRequiredService<IHttpClientFactory>();
var httpClient = clientFactory.CreateClient("GitHubClient");

return new GitHubService(httpClient, repositoryName);
});

关于c# - HttpClientFactory : Typed HttpClient with additional constructor arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59194442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com