分享一下我的弄的几个小工具类库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