個人一些小工具類庫分享
分享一下個人弄的幾個小工具類庫
github地址 https://github.com/virtualcca/FoundationLibrary
這幾個小類庫都在我司各大主要系統裏長期運作,效果良好。
主要包含:
DapperWrapper
ServiceClient
DapperWrapper
作用:基於Dapper的實例類封裝(用於配合依賴註入等使用Dapper)
參考對象:https://github.com/alterius/DapperWrapper
背景:
首先Dapper是個很優秀的微型ORM,但它是基於擴展DbConnection來實現的,對於想遵循依賴倒置原則的來說這是不符合要求的。
而且擴展方法(其實就是靜態方法)也使得代碼變得不可測試。
為了滿足依賴倒置原則以及為了讓代碼更具測試性,所以在參考了別人的做法後也自己封裝了一個
為什麽要自己封裝而不直接用別人家的呢?
因為當時我這有需要使用單語句多查詢(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個參數
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
個人一些小工具類庫分享