我的一些小工具類庫分享

分享一下我的弄的幾個小工具類庫html

github地址 https://github.com/virtualcca/FoundationLibrary git

這幾個小類庫都在我司各大主要系統里長期運做,效果良好。github

主要包含:json

DapperWrapper  app

ServiceClient  異步


DapperWrapper

做用:基於Dapper的實例類封裝(用於配合依賴注入等使用Dapper)工具

參考對象:https://github.com/alterius/DapperWrapper測試

背景:優化

首先Dapper是個很優秀的微型ORM,但它是基於擴展DbConnection來實現的,對於想遵循依賴倒置原則的來講這是不符合要求的。url

並且擴展方法(其實就是靜態方法)也使得代碼變得不可測試。

爲了知足依賴倒置原則以及爲了讓代碼更具測試性,因此在參考了別人的作法後也本身封裝了一個

爲何要本身封裝而不直接用別人家的呢?

由於當時我這有須要使用單語句多查詢(QueryMultiple),但它那個沒有,並且以爲這些仍是本身封裝的話可控度高點,就本身造了個輪子。


ServiceClient

做用:基於HttpClient的封裝用於發送Http請求

參考對象:無

背景:

首先HttpClient自己也是個足夠簡單的類了,可是仍是略有幾點讓我動了造輪子的想法

①HttpClient沒有接口實現不知足我「萬事萬物均基於接口」的原則

②HttpClient的某些固有缺陷使得其用法須要注意(參考 http://www.infoq.com/cn/news/2016/09/HttpClient

③發送Http請求的時候常規是Get方法參數都是QueryString,Post都是放Body,但願二者在方法調用的時候可以統一(讓方法內自行處理將參數放Url裏仍是放Body裏)

④由於如今公司內的請求都是基於Json交互,但願將序列化和反序列化也能一併處理掉

基於以上想法就造了個ServiceClient

常規入參就3個參數

image

url:請求的地址

method:Http謂詞,暫時支持Get/Post/Put/Patch/Delete

requestObj:請求參數

返回值有帶泛型的和不帶泛型的,帶泛型的將會用Newtonsoft.Json將返回值反序列化爲對應類型,不帶泛型的直接將返回值做爲string返回

其中,Get/Delete會將requestObj裏的類型轉換爲key-value的形式附加在url後面(QueryString),而另外幾個HttpVerb則會將參數序列化後爲Json字符串放到body裏

全部方法原始只有異步版本(Task)但經過擴展方法的形式提供了同步版本

同時有參考https://www.newtonsoft.com/json/help/html/Performance.htm 的Json相關優化建議使用基於流的反序列化

內部提供一個ExceptionLogger委託用於在請求錯誤的時候記錄一些額外的錯誤信息(好比請求的是哪一個Url出的錯)

通過配置的Json序列化設置(好比爲空的值將不參與序列化下降傳輸流量)


例子:

image

以Get的形式請求了Price/GetDistancePrice這個地址,同時將會自動將requestObj裏的那些數據轉爲key-value全部最終發送的請求長得像是

Get Price/GetDistancePrice?locationId=xx&dropoffLocationId=xx&cityName=xx&carType=xx

相關文章
相關標籤/搜索