个人一些小工具类库分享
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人一些小工具类库分享相关的知识,希望对你有一定的参考价值。
分享一下个人弄的几个小工具类库
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
以上是关于个人一些小工具类库分享的主要内容,如果未能解决你的问题,请参考以下文章