个人一些小工具类库分享

分享一下个人弄的几个小工具类库

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个参数

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

posted @ 2017-12-02 22:48  LeoLaw  阅读(701)  评论(0编辑  收藏  举报