.NET Core 3.0之深入源码理解HttpClientFactory(二)
寫在前面
上一篇文章討論了通過在ConfigureServices中調用services.AddHttpClient()方法,并基于此進一步探討了DefaultHttpClientFactory是如何創建HttpClient實例和HttpMessageHandler實例的,并了解了DefaultHttpClientFactory內部維護者一個定時器和兩個HttpMessageHandler對象集合,以定期清理無效的 HttpMessageHandler對象,詳細的內容可以點擊鏈接跳轉,接下來我會接著前一篇文章繼續展開相關討論。
詳細介紹
HttpMessageHandlerBuilder
該類是一個抽象類,起到生成器的作用,可用于用于配置HttpMessageHandler實例。HttpMessageHandlerBuilder會在ServiceCollection中被注冊為Transient服務。調用方要為每個要創建的HttpMessageHandler實例檢索一個新實例。實現者應該確保每個實例都只使用一次。
HttpMessageHandlerBuilder里面有三個比較重要的屬性:
這三個屬性意味著每個HttpMessageHandlerBuilder都需要維護自身的HttpMessageHandler實例和管道。
其內部還有一個抽象方法:
當然,內部最核心的方法就是管道的創建過程了,需要傳入主派生類自身的HttpMessageHandler和管道列表對象。它會將primaryHandler實例付給管道列表的第一個Item的InnerHandler,其他對象會依此后移,這也為我們自定義HttpMessageHandler(各種中間件)提供了無限可能。
相關實現如下:
接下來我們看一下HttpMessageHandlerBuilder一個派生類DefaultHttpMessageHandlerBuilder,其構造函數會傳入IServiceProvider實例,我們的自定義操作也可以參照這個類。
關于Build方法的實現如下,比較簡單主要是調用了CreateHandlerPipeline方法:
ITypedHttpClientFactory
這是一個抽象工廠,該組件可以使用給定邏輯名稱的自定義配置創建類型化HttpClient實例,與命名方式創建HttpClient具有相同的的功能。類型化客戶端可能用于單個后端終結點,并封裝此終結點的所有處理邏輯。另一個優勢是它們使用 DI 被注入到應用中需要的位置,下一篇文章會再次討論相關功能。
我們首先看一下調用方式:
可以看出此處的調用與普通的HttpClient沒有什么太大區別,只是增加了一個泛型標記,而且該類型沒有特殊的要求,只要是個類就行。其內部依然調用AddHttpClient(services),但它調用了另一個擴展方法,如下所示:
可以看到最終的代碼調用了ITypedHttpClientFactory的CreateClient方法,Microsoft.Extensions.Http包中有一個默認的ITypedHttpClientFactory派生類,DefaultTypedHttpClientFactory<TClient>,該類提供了了構造函數用于接收IServiceProvider實例,以及一個內部類聲明的緩存對象,該對象十分重要,它被注冊為singleton類型,已達到全局使用,并可以充當相關實例激活時的對象池。它也允許它的外部類注冊為transient,這樣它就不會在應用根服務提供程序上被關掉了。
相關代碼如下:
內部緩存對象:
最后我們看一下源碼中提供的范例:
總結
以上是生活随笔為你收集整理的.NET Core 3.0之深入源码理解HttpClientFactory(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始实现ASP.NET Core M
- 下一篇: 动手造轮子:基于 Redis 实现 Ev