From 47575857b6698afcf52d51f05bd45ab9d9bc5314 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Tue, 18 Jan 2022 23:15:37 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=94=B9=E8=BF=9B=E4=B8=8E=20IHttpClie?= =?UTF-8?q?ntFactory=20=E9=9B=86=E6=88=90=E7=9A=84=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/WechatApi/Advanced_IHttpClientFactory.md | 19 +++----- .../Implements/WechatApiHttpClientFactory.cs | 32 ++++++------- .../WechatTenpayHttpClientFactory.cs | 46 ++++++++----------- 3 files changed, 39 insertions(+), 58 deletions(-) diff --git a/docs/WechatApi/Advanced_IHttpClientFactory.md b/docs/WechatApi/Advanced_IHttpClientFactory.md index 11ab1c50..95d943fa 100644 --- a/docs/WechatApi/Advanced_IHttpClientFactory.md +++ b/docs/WechatApi/Advanced_IHttpClientFactory.md @@ -15,15 +15,13 @@ 如果你想手动管理 `HttpClient`,那么可以参考下面基于 DI/IoC 的代码实现: ```csharp -using Flurl.Http; -using Flurl.Http.Configuration; using Microsoft.Extensions.Options; using SKIT.FlurlHttpClient.Wechat.Api; using SKIT.FlurlHttpClient.Wechat.Api.Models; public class WechatApiClientFactory { - internal class DelegatingFlurlClientFactory : IFlurlClientFactory + internal class DelegatingFlurlClientFactory : Flurl.Http.Configuration.DefaultHttpClientFactory { private readonly System.Net.Http.IHttpClientFactory _httpClientFactory; @@ -32,14 +30,9 @@ public class WechatApiClientFactory _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); } - public IFlurlClient Get(Flurl.Url url) + public override System.Net.Http.HttpClient CreateHttpClient(System.Net.Http.HttpMessageHandler handler) { - return new FlurlClient(_httpClientFactory.CreateClient(url.ToUri().Host)); - } - - public void Dispose() - { - // Do Nothing + return _httpClientFactory.CreateClient(); } } @@ -52,13 +45,13 @@ public class WechatApiClientFactory { _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); _wechatApiClientOptions = wechatApiClientOptions ?? throw new ArgumentNullException(nameof(wechatApiClientOptions)); - - Flurl.Http.FlurlHttp.GlobalSettings.FlurlClientFactory = new DelegatingFlurlClientFactory(_httpClientFactory); } public WechatApiClient CreateClient() { - return new WechatApiClient(_wechatApiClientOptions.Value); + WechatApiClient client = new WechatApiClient(_wechatApiClientOptions.Value); + client.Configure((settings) => settings.FlurlHttpClientFactory = new DelegatingFlurlClientFactory(_httpClientFactory)); + return client; } } ``` diff --git a/samples/SKIT.FlurlHttpClient.Wechat.Api.Sample_Net6/Services/HttpClients/Implements/WechatApiHttpClientFactory.cs b/samples/SKIT.FlurlHttpClient.Wechat.Api.Sample_Net6/Services/HttpClients/Implements/WechatApiHttpClientFactory.cs index 3ae5dd5d..ed1a4539 100644 --- a/samples/SKIT.FlurlHttpClient.Wechat.Api.Sample_Net6/Services/HttpClients/Implements/WechatApiHttpClientFactory.cs +++ b/samples/SKIT.FlurlHttpClient.Wechat.Api.Sample_Net6/Services/HttpClients/Implements/WechatApiHttpClientFactory.cs @@ -1,25 +1,21 @@ using System; using System.Linq; -using Flurl; -using Flurl.Http; -using Flurl.Http.Configuration; +using System.Net.Http; using Microsoft.Extensions.Options; namespace SKIT.FlurlHttpClient.Wechat.Api.Sample.Services.HttpClients.Implements { partial class WechatApiHttpClientFactory : IWechatApiHttpClientFactory { - private readonly System.Net.Http.IHttpClientFactory _httpClientFactory; + private readonly IHttpClientFactory _httpClientFactory; private readonly Options.WechatOptions _wechatOptions; public WechatApiHttpClientFactory( - System.Net.Http.IHttpClientFactory httpClientFactory, + IHttpClientFactory httpClientFactory, IOptions wechatOptions) { _httpClientFactory = httpClientFactory; _wechatOptions = wechatOptions.Value; - - FlurlHttp.GlobalSettings.FlurlClientFactory = new DelegatingFlurlClientFactory(_httpClientFactory); } public WechatApiClient Create(string appId) @@ -32,34 +28,32 @@ namespace SKIT.FlurlHttpClient.Wechat.Api.Sample.Services.HttpClients.Implements if (wechatAccountOptions == null) throw new Exception("未在配置项中找到该 AppId 对应的微信账号。"); - return new WechatApiClient(new WechatApiClientOptions() + var wechatApiClientOptions = new WechatApiClientOptions() { AppId = wechatAccountOptions.AppId, AppSecret = wechatAccountOptions.AppSecret, PushToken = _wechatOptions.CallbackToken - }); + }; + var wechatApiClient = new WechatApiClient(wechatApiClientOptions); + wechatApiClient.Configure((settings) => settings.FlurlHttpClientFactory = new DelegatingFlurlClientFactory(_httpClientFactory)); + return wechatApiClient; } } partial class WechatApiHttpClientFactory { - internal class DelegatingFlurlClientFactory : IFlurlClientFactory + internal class DelegatingFlurlClientFactory : Flurl.Http.Configuration.DefaultHttpClientFactory { - private readonly System.Net.Http.IHttpClientFactory _httpClientFactory; + private readonly IHttpClientFactory _httpClientFactory; - public DelegatingFlurlClientFactory(System.Net.Http.IHttpClientFactory httpClientFactory) + public DelegatingFlurlClientFactory(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); } - public IFlurlClient Get(Url url) + public override HttpClient CreateHttpClient(HttpMessageHandler handler) { - return new FlurlClient(_httpClientFactory.CreateClient(url.ToUri().Host)); - } - - public void Dispose() - { - // Do Nothing + return _httpClientFactory.CreateClient(); } } } diff --git a/samples/SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net6/Services/HttpClients/Implements/WechatTenpayHttpClientFactory.cs b/samples/SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net6/Services/HttpClients/Implements/WechatTenpayHttpClientFactory.cs index c07c85ca..48e89336 100644 --- a/samples/SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net6/Services/HttpClients/Implements/WechatTenpayHttpClientFactory.cs +++ b/samples/SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample_Net6/Services/HttpClients/Implements/WechatTenpayHttpClientFactory.cs @@ -1,28 +1,24 @@ using System; using System.Linq; -using Flurl; -using Flurl.Http; -using Flurl.Http.Configuration; +using System.Net.Http; using Microsoft.Extensions.Options; namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Implements { partial class WechatTenpayHttpClientFactory : IWechatTenpayHttpClientFactory { - private readonly System.Net.Http.IHttpClientFactory _httpClientFactory; + private readonly IHttpClientFactory _httpClientFactory; private readonly Options.TenpayOptions _tenpayOptions; private readonly IWechatTenpayCertificateManagerFactory _tenpayCertificateManagerFactory; public WechatTenpayHttpClientFactory( - System.Net.Http.IHttpClientFactory httpClientFactory, + IHttpClientFactory httpClientFactory, IOptions tenpayOptions, IWechatTenpayCertificateManagerFactory tenpayCertificateManagerFactory) { _httpClientFactory = httpClientFactory; _tenpayOptions = tenpayOptions.Value; _tenpayCertificateManagerFactory = tenpayCertificateManagerFactory; - - FlurlHttp.GlobalSettings.FlurlClientFactory = new DelegatingFlurlClientFactory(_httpClientFactory); } public WechatTenpayClient Create(string merchantId) @@ -31,42 +27,40 @@ namespace SKIT.FlurlHttpClient.Wechat.TenpayV3.Sample.Services.HttpClients.Imple // 这里的工厂方法是为了演示多租户而存在的,可根据商户号生成不同的 API 客户端。 // 如果你的项目只存在唯一一个租户,那么直接注入 `WechatTenpayClient` 即可。 - var tenpayMerchantOptions = _tenpayOptions.Merchants?.FirstOrDefault(e => string.Equals(merchantId, e.MerchantId)); - if (tenpayMerchantOptions == null) + var tenpayMerchantConfig = _tenpayOptions.Merchants?.FirstOrDefault(e => string.Equals(merchantId, e.MerchantId)); + if (tenpayMerchantConfig == null) throw new Exception("未在配置项中找到该 MerchantId 对应的微信商户号。"); - return new WechatTenpayClient(new WechatTenpayClientOptions() + var wechatTenpayClientOptions = new WechatTenpayClientOptions() { - MerchantId = tenpayMerchantOptions.MerchantId, - MerchantV3Secret = tenpayMerchantOptions.SecretV3, - MerchantCertSerialNumber = tenpayMerchantOptions.CertSerialNumber, - MerchantCertPrivateKey = tenpayMerchantOptions.CertPrivateKey, - CertificateManager = _tenpayCertificateManagerFactory.Create(tenpayMerchantOptions.MerchantId), + MerchantId = tenpayMerchantConfig.MerchantId, + MerchantV3Secret = tenpayMerchantConfig.SecretV3, + MerchantCertSerialNumber = tenpayMerchantConfig.CertSerialNumber, + MerchantCertPrivateKey = tenpayMerchantConfig.CertPrivateKey, + CertificateManager = _tenpayCertificateManagerFactory.Create(tenpayMerchantConfig.MerchantId), AutoEncryptRequestSensitiveProperty = true, AutoDecryptResponseSensitiveProperty = true - }); + }; + var wechatTenpayClient = new WechatTenpayClient(wechatTenpayClientOptions); + wechatTenpayClient.Configure((settings) => settings.FlurlHttpClientFactory = new DelegatingFlurlClientFactory(_httpClientFactory)); + return wechatTenpayClient; } } partial class WechatTenpayHttpClientFactory { - internal class DelegatingFlurlClientFactory : IFlurlClientFactory + internal class DelegatingFlurlClientFactory : Flurl.Http.Configuration.DefaultHttpClientFactory { - private readonly System.Net.Http.IHttpClientFactory _httpClientFactory; + private readonly IHttpClientFactory _httpClientFactory; - public DelegatingFlurlClientFactory(System.Net.Http.IHttpClientFactory httpClientFactory) + public DelegatingFlurlClientFactory(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); } - public IFlurlClient Get(Url url) + public override HttpClient CreateHttpClient(HttpMessageHandler handler) { - return new FlurlClient(_httpClientFactory.CreateClient(url.ToUri().Host)); - } - - public void Dispose() - { - // Do Nothing + return _httpClientFactory.CreateClient(); } } }