1. 程式人生 > >個人一些小工具類庫分享

個人一些小工具類庫分享

key logger city 參數 註入 git 參考 tpc 使用

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

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

個人一些小工具類庫分享