WebApi client 的面向切面编程

.Net的面向切面编程

.Net的服务端应用AOP很常见,在Asp.net MVC与Asp.net WebApi等新框架里到处都有AOP的影子,我们可以把一个服务方法“切”为很多面,日志面、验证面、请求方式处理、接口业务实现等多个面,有一些面可以使用过滤器特性(FilterAttribute)进行编写,然后很方便和打上特性即可,对于一般的工程师,只需要专注实现接口业务实现。

在流行SOAP的年代,很少需要一个强悍的Client,而今天restful时代,.net也出了一个HttpClient,可以说是与Asp.net WebApi相配吧,虽然HttpClient相对WebClient在http接口请求有了质的变化,但相比服务端的webApi,AOP的影子都不见了。

 

让HttpClient支持AOP

所谓让HttpClient支持AOP,是指在对HttpClient进行组合封装,基于HttpClient再打造一款客户端框架,将AOP的理念引入到新客户端框架来,我们可以简单分析一下HttpClient请求一个接口要做的基本事情,同时把这些事情“切”为多个面,Http请求大致如下:

{Method} {Path}?query1={value1}&query2={value2}
{Header1}
{Header2}{body}

我可以切出几个面:

  1. method与path处理

  2. query参数处理

  3. 请求body内容处理

  4. 发送请求

  5. 回复结果处理

我们所做的框架,需要把1、2、3、5封装为面,同时调用HttpClient来完成第4个动作。

 

AOP基础框架的选择

可以参考这个博客:NET AOP(一)七种AOP实现方法 

这里我选择了Castle,Castle可以动态创建接口的实现类并实例化,可以对接口方法调用前进行拦截,并设置返回结果。

我们可以根据这个拦截功能,收集每个面的配置,组装为http请求消息,然后调用HttpClient为完成发送请求,再让第5个面来进行回复结果处理。基于Castle与HttpClient,我们就可以封装出支持AOP的HttpClient新框架,这里命名为WebApiClient吧。

 

WebApiClient设计

现在,我们的目标是,让调用WebApi与编写WebApi一样,声明接口、参数、返回值,打上请求方法与路径(面)特性、返回结果处理(面)特性、请求内容(面)特性。然后框架帮我们实现并取得实例,然后就可以调用这些接口了。

Step1:声明接口

namespace Demo

{

    [JsonReturn]

    [HttpHost("http://www.mywebapi.com")]

    public interface MyWebApi

    {

        [HttpGet("/webapi/{type}/about")] // GET webapi/typeValue/about

        Task<ApiResult<string>> GetAboutAsync(string type);



        [HttpGet("/webapi/user")]  // GET webapi/user?userName=aa&nickName=bb&&BeginTime=cc&EndTime=dd

        Task<ApiResult<UserInfo>> GetUserAsync(string userName, string nickName, TimeFilter timeFilter);



        [HttpPut("/webapi/user")] // PUT webapi/user

        Task<ApiResult<bool>> UpdateUserAsync([JsonContent] UserInfo loginInfo);



        [HttpDelete("/webapi/user")] // DELETE  webapi/user?id=idValue

        Task<ApiResult<bool>> DeleteUserAsync(string id);



        [HttpDelete("/webapi/user/{id}")] // DELETE  webapi/user/idValue

        Task<ApiResult<bool>> DeleteUser2Async(string id);

    }

}

Step2:获取接口实并调用

namespace Demo

{

    class Program

    {

        static async void Test()

        {

            var myWebApi = new WebApiClient.HttpApiClient().GetHttpApi<MyWebApi>();


            await myWebApi.GetAboutAsync("typeValue");

            await myWebApi.UpdateUserAsync(new UserInfo { UserName = "abc", Password = "123456" });

            await myWebApi.DeleteUser2Async(id: "id001");

        }


        static void Main(string[] args)

        {

            Test();

            Console.ReadLine();

        }

    }

}

WebApiClient更多的面

我们可以给框架增加更多的自定义面,比如日志记录、返回结果统一验证等等,这些就不一一介绍,但思想还是一样的。

 

WebApiClient开放

这是一个开放的框架,托管在 https://github.com/xljiulang/WebApiClient ,已经支持.net core平台。 如果你喜欢,点个星吧。

相关文章:

  • 自动类型安全的REST .NET标准库refit

  • Swagger+AutoRest 生成web api客户端(.Net)

原文地址: http://www.cnblogs.com/kewei/p/6646601.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

09-一对多关系建表

多表操作 目录 表之间关系一对多关系建表原则表之间关系 一对一关系&#xff1a;一夫一妻。 一对多关系&#xff1a; 一个部门有多个员工&#xff0c;一个员工只能属于某一个部门。 一个班级有多个学生&#xff0c;一个学生只能属于一个班级。 多对多关系&#xff1a; 一个…

jzoj6191-[NOI2019模拟2019.5.31]Exchange【线段树】

正题 题目大意 一个序列&#xff0c;给定若干个区间[l..r][l..r][l..r] 从l∼rl\sim rl∼r任意一个位置出发&#xff0c;见到比手中大的数字就交换&#xff0c;到rrr求最小的交换次数 (注意&#xff0c;并不是真的交换) 解题思路 首先算出每个点的后继(在它后面第一个比他大的…

面试阿里挂了却拿到网易、点我达offer,一个三年经验Java程序员的面试总结

转载自 面试阿里挂了却拿到网易、点我达offer&#xff0c;一个三年经验Java程序员的面试总结 前言 15年毕业到现在有三年多了&#xff0c;最近去面试了阿里集团&#xff08;菜鸟网络&#xff0c;蚂蚁金服&#xff09;、网易、滴滴、点我达&#xff0c;最终收到点我达、网易o…

10-多对一左连接查询分步查询(查询所有订单及订单对应的客户)

左连接查询&#xff08;级联查询&#xff09; 回顾一下&#xff1a;左连接查询&#xff0c;将左边表(order)里的全部内容查出&#xff0c;右边表(customer)查满足条件的。 SELECT * FROM order AS o LEFT JOIN customer AS c on o.cust_id c.cust_id;1那么在 MyBatis 中如何…

入门干货之Grpc的.Net 封装-MagicOnion

0x01、Grpc1、介绍Google主导开发的RPC框架&#xff0c;使用HTTP/2协议并用ProtoBuf作为序列化工具&#xff0c;支持多种语言。在.NET Core “大更新” 之前&#xff0c;也就是目前来说还算是个很不错的选择。2、吐槽a、有很多性能比较的文章拿Grpc开涮.b、搭建困难&#xff0c…

欢乐纪中A组周六赛【2019.6.1】

前言 六一儿童节快乐(然而我还在学校) dalao都走了&#xff0c;导致只剩下我们这帮菜鸡在被虐 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC111(J−2)ZYC(J-2)ZYC(J−2)ZYC1301301303030301001001000002…

11-分步查询懒加载

分步查询——懒加载模式 目录 懒加载模式示例不使用懒加载使用懒加载aggressiveLazyLoadinglazyLoadTriggerMethods所谓懒加载&#xff0c;也称延时加载&#xff0c;是指不一下子加载完全部资源。需要用到哪些资源才去加载这些资源&#xff0c;用不到的资源&#xff0c;就不去…

利用Service Fabric承载eShop On Containers

从模块化到微服务化从Pet Shop 到eShop on Container都是Microsoft在技术演进的路径上给开发者展示.Net的开发能力和架构能力的Sample工程&#xff0c;Petshop的时候更多的是展现应用的分层架构&#xff0c;设计的抽象与模块间的通讯。到了eShop on Container更多的关注在架构设…

2019阿里天猫团队Java高级工程师面试题之三轮面试

转载自 2019阿里天猫团队Java高级工程师面试题之三轮面试 作者&#xff1a;编程砖家 https://www.cnblogs.com/xiaoyangjia/p/10697324.html 一.第一面 1.五分钟自我介绍&#xff0c;说说自己的擅长及拿手的技术 自我介绍是为了考察面试者的语言表达和总结概括能力&#x…

P2680-运输计划【LCA,树上差分,二分答案】

正题 题目链接:https://www.luogu.org/problemnew/show/P2680 题目大意 一棵带权无根树&#xff0c;给出若干条路径。选择一条边使其边权变为0&#xff0c;要求路径的长度的最大值最小。 解题思路 首先最大值最小我们可以想到二分答案&#xff0c;现在我们二分到midmidmid了…

12-多对一添加操作(添加新客户及对应的新订单)

多对一添加操作 场景&#xff1a;现在想要添加一个新客户对应一个新订单&#xff0c;那么要怎么来添加呢&#xff1f; 分析&#xff1a;由于添加订单时&#xff0c;客户对订单是一对多的关系&#xff0c;所以添加订单的时候必须要指明一位客户。 要同时添加新客户以及一个新订…

.NET Core+MySql+Nginx 容器化部署

1. 引言上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习&#xff0c;完成ASP.NET Core MySql Nginx的容器化部署。本文是基于CentOS 7.4环境进行演示&#xff0c;示例项目可以访问Docker.NetCore.MySql进行下载。2. Hello MySQL同样我们还是以循序…

HiveSQL常用优化方法全面总结

转载自 HiveSQL常用优化方法全面总结 Hive作为大数据领域常用的数据仓库组件&#xff0c;在平时设计和查询时要特别注意效率。影响Hive效率的几乎从不是数据量过大&#xff0c;而是数据倾斜、数据冗余、job或I/O过多、MapReduce分配不合理等等。对Hive的调优既包含对HiveQL语…

P3597-[POI2015]WYC【矩阵乘法,倍增】

前言 正题 题目链接:https://www.luogu.org/problemnew/show/P3597 题目大意 问第kkk长的路径长度(非简单路径) 解题思路 先考虑kkk比较小时的情况&#xff0c;我们可以求出长度为111的路径&#xff0c;长度为222的路径&#xff0c;然后以此类推找到第一个与前面的和到kkk就…

13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)

查询所有客户以及对应的订单 目录 左连接查询&#xff08;不支持懒加载&#xff09;分步查询&#xff08;支持懒加载&#xff09;左连接查询&#xff08;不支持懒加载&#xff09; 场景&#xff1a;我们想要查询出所有的客户&#xff0c;并且把每个客户对应的订单也查出来。…

实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作

转载自 实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作 供稿 | eBay ADI-Carmel Team 作者 | 金澜涛 编辑 | 顾欣怡 本文7309字&#xff0c;预计阅读时间22分钟 导读 本文介绍eBay Carmel团队利用Delta Lake&#xff0c;使Spark SQL支持Teradata的Update/Delete语法。…

14-多对多关系建表

多对多关系建表 目录 多对多关系多对多关系建表原则domain多对多关系 一个老师可以教多个学生&#xff0c;一个学生可以被多个老师教。一个学生可以选择多门课程&#xff0c;一门课程可以被多个学生选择。一个用户可以选择多个角色&#xff0c;一个角色可以被多个用户选择。…

DevOps文档中心的技术实践演进

这应该算是《Git企业开发者教程》的篇外篇&#xff0c;介绍一下这个教程是怎样写出来的。相信每个技术人都有类似下面的文件夹&#xff0c;保存着你辛苦工作的成果。实际的感觉&#xff1a;看着闹心&#xff0c;弃之不舍。一份文档久经修改&#xff0c;不能定稿&#xff0c;循环…

CF7D-Palindrome Degree【字符串hash,dp】

正题 luogu链接:https://www.luogu.org/problemnew/show/CF7D 题目大意 定义kkk级回文串为一个字符串的(1,⌊n/2⌋)(1,\lfloor n/2 \rfloor)(1,⌊n/2⌋)和(n−⌊n/2⌋,n)(n-\lfloor n/2 \rfloor,n)(n−⌊n/2⌋,n)都是k−1k-1k−1级回文串。 求这个字符的所有前缀的回文串等级…

MySQL UPDATE 语句一个“经典”的坑

转载自 MySQL UPDATE 语句一个“经典”的坑 来源&#xff1a;ju.outofmemory.cn/entry/336774 有问题的SQL语句 why? 倒回去再重试验一把 最近好几次有开发同学在钉钉上问我&#xff0c;比如下图&#xff1a; 问题归纳起来就是&#xff1a;在MySQL里面update一条记录&…