WebApiClient库支持AOT
1 库简介
WebApiClient是开源在github上的一个http客户端库,内部基于HttpClient开发,只需要定义c#接口(interface),并打上相关特性,即可异步调用http-api。该库支持framework4.5+、netstandard1.3、netcoreapp2.1,包含以下特性:
- 原生的支持面向切面编程;
- 内置丰富的特性,支持自定义特性;
- 灵活和Filter、GlobalFilter和IParameterable;
- 功能强大的序列化工具;
- 与外部HttpMessageHandler无缝衔接;
- 独一无二的请求异常条件重试功能和异常处理链式语法功能
2 WebApiClient.JIT
JIT,即Just-in-time,动态(即时)编译,边运行边编译,WebApiClient.JIT在运行时,在需要的时候使用Emit创建Http请求接口的代理类。
2.1 动态代理
[HttpHost("http://www.webapiclient.com")]
public interface IMyWebApi : IHttpApi
{
// GET webapi/user?account=laojiu
// Return 原始string内容
[HttpGet("/webapi/user")]
ITask<string> GetUserByAccountAsync(string account);
// POST webapi/user
// Body Account=laojiu&password=123456
// Return json或xml内容
[HttpPost("/webapi/user")]
ITask<UserInfo> UpdateUserWithFormAsync([FormContent] UserInfo user);
}
例如,开发者定义了如上请求接口,在调用到 HttpApiClient.Create<IMyWebApi>()时,才会自动创建一个动态模块,动态模块里定义一个实现了IMyWebApi接口的类型,使用IL实现接口的方法,最后实例化并返回此类型的实例,这些过程,都离不开Emit和JIT。
2.2 优势和劣势
优势:不依赖于编译器,在运行时用到接口的时候,按需默默地为开发者实现了请求接口的代理类,这些接口的定义可以在外部程序集,同时编写接口的语言只要是能编译为中间公共语言的就得到支持。
劣势:由于严重依赖于JIT,对于编译阶段就将IL翻译到平台本机指令的地方,将无法得到支持,比如unity3d、ios或uwp,因为需要在编译阶段将IL再编译为平台本机指令,而动态代理IL在这个时期还不存在,同时编译器也会禁止代码里使用Emit相关Api,因为运行时不会再有JIT的存在。
3 WebApiClient.AOT
AOT,Ahead Of Time,指运行前编译,WebApiClient.AOT在编译阶段,就自动插入Http请求接口的代理类IL指令。
3.1 编译时插入代理类IL
这类需求实际上是自动帮开发者补充接口实现类的代码,然后合并到项目一起编译。考虑到开发语言的众多,比如c#、vb.net、c++/cli和f#等等,而且语言特性也在不断变化,所以WebApiClient没有从代码语法分析和自动补充接口实现类代码这个角度来解决这个问题,而是在编译过程中,等待输出程序集之后,再往程序集文件里写入代理类的IL代码,这样就可以规避上层编程语言的语法分析难题。
.net的编译过程,实际上为msbuild的一系列任务组合完成,我们的项目文件.csproj,实际上msbuild脚本,WebApiClient需要做的是,给msbuild增加一个自定义的任务,用于在完成CoreCompile任务之后,使用mono.cecli修改编译得到的程序集,插入代理类的IL。
<?xml version="1.0" encoding="utf-16"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Runtime Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp1.0</Runtime>
<Runtime Condition="'$(MSBuildRuntimeType)' != 'Core'">net45</Runtime>
<TaskAssembly>$(MSBuildThisFileDirectory)..\BuildTask\$(Runtime)\WebApiClient.AOT.Task.dll</TaskAssembly>
<TargetAssembly>$(MSBuildProjectDirectory)\$(IntermediateOutputPath)$(TargetFileName)</TargetAssembly>
</PropertyGroup>
<UsingTask TaskName="WebApiClient.AOT.Task.ProxyTask" AssemblyFile="$(TaskAssembly)" />
<Target Name="BuildProxy" AfterTargets="CoreCompile" DependsOnTargets="ResolveProjectReferences;ResolveAssemblyReferences">
<Message Text="BuildProxy: $(TargetAssembly)" Importance="high" />
<WebApiClient.AOT.Task.ProxyTask TargetAssembly="$(TargetAssembly)" References="@(_ResolveAssemblyReferenceResolvedFiles)" />
</Target>
</Project>
3.2 优势和劣势
优势:支持的平台更广泛,在编译时就可以静态检查接口声明是否分的符合框架约定。
劣势:依赖于编译器和编译过程,必须在项目引用nuget包才支持,直接引用WebApiClient.AOT库开发的话,编译时不会插入IL代理指令。
4 如何选择
如果你不是用于unity3d、ios或uwp这些平台应用开发,选择WebApiClient.JIT将比较方便;如果你不确定未来项目是否也会用于上面这些平台,就选择WebApiClient.AOT。不过不管怎么样,两个提供Api是完全一致,区别只在于你看不到的编译过程或运行时过程。
WebApiClient库支持AOT的更多相关文章
- Python-数据库支持
10.Python-数据库支持 使用数据库的好处: a.支持数据的并发访问,多个用户同时对基于磁盘的数据进行读写而不造成任何文件的损坏: b.支持根据多个数据字段或属性进行复杂的搜索: 1.如何操作数 ...
- OSS.Common获取枚举字典列表标准库支持
上篇(.Net Standard扩展支持实例分享)介绍了OSS.Common的标准库支持扩展,也列举了可能遇到问题的解决方案.由于时间有限,同时.net standard暂时还没有提供对Descrip ...
- c++ 11开始语言本身和标准库支持并发编程
c++ 11开始语言本身和标准库支持并发编程,意味着真正要到编译器从语言和标准库层面开始稳定,估计得到17标准出来.14稳定之后的事情了,根据历史经验,新特性的引入到稳定被广泛采用至少要一个大版本的跨 ...
- 自动检测GD库支持的图像类型
以下代码通过自动检测GD库支持的图像类型 来写出移直性更好的PHP代码 <?php if(function_exists("imagegif")){ header(" ...
- 微软企业库支持 MySql
微软企业库支持 MySql 三步让企业库支持 mysql 数据库 1.创建 MySqlDatabaseData 类 using Microsoft.Practices.EnterpriseLibr ...
- android WebP解析开源库-支持高清无损
在我们的项目中需要支持WebP高清无损图片,推荐一个我们已经使用的解析开源库给大家:https://github.com/keshuangjie/WebpExample/tree/master/lib ...
- 修改GDAL库支持IRSP6数据
使用GDAL库发现不能打开IRSP6的数据,不过看GDAL提供的文件格式里面却是支持IRSP6的数据的,具体可以参考网页http://www.gdal.org/frmt_fast.html.下面图1是 ...
- 修改GDAL库支持RPC像方改正模型
最近在做基于RPC的像方改正模型,方便对数据进行测试,修改了GDAL库中的RPC纠正模型,使之可以支持RPC像方改正参数. 下面是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一 ...
- 使GDAL库支持中文路径或中文文件名的处理方法
之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图: 解决方法: 1. 在所有使用GDALAllRegist ...
随机推荐
- 【翻译】ExtJS vs AngularJS
原文:ExtJS vs AngularJS ExtJS和AngularJS是两个行业内领先的富界面开发框架.TechFerry有机会使用Ext JS和Angular JS来开发多个富界面的单页面应用程 ...
- Cocos2d中update与fixedUpdate的区别(四)
关于fixedUpdate:方法的目的 现在,想象一下在小球飞行的位置1到8之间有一个移动的平台: 该平台不停地上升和下降.有些时候小球可以不碰到而飘过平台,有些时候小球会和平台发生碰撞: 这表示小球 ...
- 服务端技术进阶(六)Ant和Maven的作用是什么?两者之间功能、特点有哪些区别?
服务端技术进阶(六)Ant和Maven的作用是什么?两者之间功能.特点有哪些区别? Ant和Maven都是基于Java的构建(build)工具.理论上来说,有些类似于(Unix)C中的make ,但没 ...
- 【Qt编程】Qt学习笔记<三>
1. 如果程序中使用了png以外格式的图片,在发布程序时就要将Qt安装目录下plugins中的imagineformats文件复制到发布文件中. 2. 在函数声明处快速添加函数定义 ...
- Android NFC开发(一)——初探NFC,了解当前前沿技术
Android NFC开发(一)--初探NFC,了解当前前沿技术 官方文档:http://developer.android.com/guide/topics/connectivity/nfc/ind ...
- ROS探索总结(十二)——坐标系统
在机器人的控制中,坐标系统是非常重要的,在ROS使用tf软件库进行坐标转换. 相关链接:http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一.tf简介 ...
- 总结:如何驱动DS18B20温度传感器
DS18B20时序分析: 以下是STM32的驱动代码: #include "bsp_ds18b20.h" static void DS18B20_GPIO_Config(void) ...
- obj-c编程05:类的多态与id动态绑定
说实在的,写这第5篇的时候十分纠结,代码老是不能动态绑定,在编译时就会出错,最后发现这是开了ARC的原因.开了ARC obj-c就不能动态绑定了吗?这个问题还不清楚哦.把ARC关闭后,虽然会有警告,但 ...
- 《深入理解Java虚拟机》读书笔记3--垃圾回收算法
转载:http://blog.csdn.net/tjiyu/article/details/53983064 下面先来了解Java虚拟机垃圾回收的几种常见算法:标记-清除算法.复制算法.标记-整理算法 ...
- JAVA面试题集
基础知识: 1.C++或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2种情况.一种是JAVA类库 ...