40 lines
1.3 KiB
C#
40 lines
1.3 KiB
C#
using FastGithub.Configuration;
|
|
using FastGithub.DomainResolve;
|
|
using Microsoft.Extensions.Options;
|
|
using System.Collections.Concurrent;
|
|
|
|
namespace FastGithub.Http
|
|
{
|
|
/// <summary>
|
|
/// HttpClient工厂
|
|
/// </summary>
|
|
sealed class HttpClientFactory : IHttpClientFactory
|
|
{
|
|
private readonly IDomainResolver domainResolver;
|
|
private ConcurrentDictionary<DomainConfig, HttpClientHandler> domainHandlers = new();
|
|
|
|
/// <summary>
|
|
/// HttpClient工厂
|
|
/// </summary>
|
|
/// <param name="domainResolver"></param>
|
|
/// <param name="options"></param>
|
|
public HttpClientFactory(
|
|
IDomainResolver domainResolver,
|
|
IOptionsMonitor<FastGithubOptions> options)
|
|
{
|
|
this.domainResolver = domainResolver;
|
|
options.OnChange(opt => this.domainHandlers = new());
|
|
}
|
|
|
|
/// <summary>
|
|
/// 创建httpClient
|
|
/// </summary>
|
|
/// <param name="domainConfig"></param>
|
|
/// <returns></returns>
|
|
public HttpClient CreateHttpClient(DomainConfig domainConfig)
|
|
{
|
|
var httpClientHandler = this.domainHandlers.GetOrAdd(domainConfig, config => new HttpClientHandler(config, this.domainResolver));
|
|
return new HttpClient(httpClientHandler, disposeHandler: false);
|
|
}
|
|
}
|
|
} |