using FastGithub.Configuration; using FastGithub.DomainResolve; using System; using System.Collections.Concurrent; namespace FastGithub.Http { /// /// HttpClient工厂 /// sealed class HttpClientFactory : IHttpClientFactory { private readonly IDomainResolver domainResolver; /// /// httpHandler的生命周期 /// private readonly TimeSpan lifeTime = TimeSpan.FromMinutes(1d); /// /// HttpHandler清理器 /// private readonly LifetimeHttpHandlerCleaner httpHandlerCleaner = new(); /// /// LazyOf(LifetimeHttpHandler)缓存 /// private readonly ConcurrentDictionary> httpHandlerLazyCache = new(); /// /// HttpClient工厂 /// /// public HttpClientFactory(IDomainResolver domainResolver) { this.domainResolver = domainResolver; } /// /// 创建httpClient /// /// /// public HttpClient CreateHttpClient(DomainConfig domainConfig) { var lifetimeHttpHandlerLazy = this.httpHandlerLazyCache.GetOrAdd(domainConfig, this.CreateLifetimeHttpHandlerLazy); var lifetimeHttpHandler = lifetimeHttpHandlerLazy.Value; return new HttpClient(lifetimeHttpHandler, disposeHandler: false); } /// /// 创建LazyOf(LifetimeHttpHandler) /// /// /// private Lazy CreateLifetimeHttpHandlerLazy(DomainConfig domainConfig) { return new Lazy(() => this.CreateLifetimeHttpHandler(domainConfig), true); } /// /// 创建LifetimeHttpHandler /// /// private LifetimeHttpHandler CreateLifetimeHttpHandler(DomainConfig domainConfig) { var httpClientHandler = new HttpClientHandler(domainConfig, this.domainResolver); return new LifetimeHttpHandler(httpClientHandler, this.lifeTime, this.OnLifetimeHttpHandlerDeactivate); } /// /// 当有httpHandler失效时 /// /// httpHandler private void OnLifetimeHttpHandlerDeactivate(LifetimeHttpHandler lifetimeHttpHandler) { // 切换激活状态的记录的实例 var domainConfig = ((HttpClientHandler)lifetimeHttpHandler.InnerHandler!).DomainConfig; this.httpHandlerLazyCache[domainConfig] = this.CreateLifetimeHttpHandlerLazy(domainConfig); this.httpHandlerCleaner.Add(lifetimeHttpHandler); } } }