2
0

HttpClientFactory.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using FastGithub.Configuration;
  2. using FastGithub.DomainResolve;
  3. using Microsoft.Extensions.Options;
  4. using System.Collections.Concurrent;
  5. namespace FastGithub.Http
  6. {
  7. /// <summary>
  8. /// HttpClient工厂
  9. /// </summary>
  10. sealed class HttpClientFactory : IHttpClientFactory
  11. {
  12. private readonly IDomainResolver domainResolver;
  13. private ConcurrentDictionary<DomainConfig, HttpClientHandler> domainHandlers = new();
  14. /// <summary>
  15. /// HttpClient工厂
  16. /// </summary>
  17. /// <param name="domainResolver"></param>
  18. /// <param name="options"></param>
  19. public HttpClientFactory(
  20. IDomainResolver domainResolver,
  21. IOptionsMonitor<FastGithubOptions> options)
  22. {
  23. this.domainResolver = domainResolver;
  24. options.OnChange(opt => this.domainHandlers = new());
  25. }
  26. /// <summary>
  27. /// 创建httpClient
  28. /// </summary>
  29. /// <param name="domainConfig"></param>
  30. /// <returns></returns>
  31. public HttpClient CreateHttpClient(DomainConfig domainConfig)
  32. {
  33. var httpClientHandler = this.domainHandlers.GetOrAdd(domainConfig, config => new HttpClientHandler(config, this.domainResolver));
  34. return new HttpClient(httpClientHandler, disposeHandler: false);
  35. }
  36. }
  37. }