分享一下我的弄的幾個小工具類庫html
github地址 https://github.com/virtualcca/FoundationLibrary git
這幾個小類庫都在我司各大主要系統里長期運做,效果良好。github
主要包含:json
DapperWrapper app
ServiceClient 異步
做用:基於Dapper的實例類封裝(用於配合依賴注入等使用Dapper)工具
參考對象:https://github.com/alterius/DapperWrapper測試
背景:優化
首先Dapper是個很優秀的微型ORM,但它是基於擴展DbConnection來實現的,對於想遵循依賴倒置原則的來講這是不符合要求的。url
並且擴展方法(其實就是靜態方法)也使得代碼變得不可測試。
爲了知足依賴倒置原則以及爲了讓代碼更具測試性,因此在參考了別人的作法後也本身封裝了一個
爲何要本身封裝而不直接用別人家的呢?
由於當時我這有須要使用單語句多查詢(QueryMultiple),但它那個沒有,並且以爲這些仍是本身封裝的話可控度高點,就本身造了個輪子。
做用:基於HttpClient的封裝用於發送Http請求
參考對象:無
背景:
首先HttpClient自己也是個足夠簡單的類了,可是仍是略有幾點讓我動了造輪子的想法
①HttpClient沒有接口實現不知足我「萬事萬物均基於接口」的原則
②HttpClient的某些固有缺陷使得其用法須要注意(參考 http://www.infoq.com/cn/news/2016/09/HttpClient )
③發送Http請求的時候常規是Get方法參數都是QueryString,Post都是放Body,但願二者在方法調用的時候可以統一(讓方法內自行處理將參數放Url裏仍是放Body裏)
④由於如今公司內的請求都是基於Json交互,但願將序列化和反序列化也能一併處理掉
基於以上想法就造了個ServiceClient
常規入參就3個參數
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序列化設置(好比爲空的值將不參與序列化下降傳輸流量)
例子:
以Get的形式請求了Price/GetDistancePrice這個地址,同時將會自動將requestObj裏的那些數據轉爲key-value全部最終發送的請求長得像是
Get Price/GetDistancePrice?locationId=xx&dropoffLocationId=xx&cityName=xx&carType=xx