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); } } }