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