.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 

WebApi client 的面向切面编程相关推荐

  1. 面向切面编程应用_应用面向方面的编程

    面向切面编程应用 1.引言 面向方面编程的主要目标是将跨领域关注点分离. 当我们谈论跨领域的关注时,我们指的是在我们的系统或应用程序中的多个地方使用的通用功能. 这些概念包括: 记录中 交易管理 错误 ...

  2. C# 中使用面向切面编程(AOP)中实践代码整洁(转)

    出处:https://www.cnblogs.com/chenug/p/9848852.html 1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则( ...

  3. Spring | 深入理解面向切面编程(AOP)

    个人主页:BoBooY的CSDN博客_Java领域博主 前言:这节我们来学习什么是面向切面编程(AOP),为了方便大家理解,我们先了解代理模式再学习AOP. 文章目录 代理模式 7.1.静态代理 7. ...

  4. 面向切面编程实现Nestjs接口Api数据缓存

    一.业务场景 在后端接口开发过程中,我们经常会谈论的话题,提高接口响应速度,前端接口调用后端接口响应时间的缩短,我们抛开数据库设计及后端代码的业务逻辑等问题.我们经常会听到说用redis做数据缓存,直 ...

  5. Java绝地求生—Spring AOP面向切面编程

    Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...

  6. 【Spring】面向切面编程AOP

    AOP基础 什么是AOP [废话解释]在软件业,AOP全称Aspect Oriented Programming 即:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AO ...

  7. 【spring】初识aop(面向切面编程) 使用jdk动态代理

    BankServiceIImple.java 代码实现: package com.zzxtit.aop;import java.math.BigDecimal;public interface Ban ...

  8. Spring 面向切面编程

    AOP,也就是面向方面编程或者说面向面编程,是一种很重要的思想.在企业级系统中经常需要打印日志.事务管理这样针对某一方面的需求,但是传统的面向对象编程无法很好的满足这些需求.因此催生了面向切面编程这样 ...

  9. Spring核心AOP(面向切面编程)

    AOP(面向切面编程) 原理 相关术语 系统日志增强 异常抛出增强 最终增强 环绕增强 使用注解实现AOP AspectJ 转载于:https://www.cnblogs.com/xhddbky/p/ ...

最新文章

  1. python turtle画圣诞树-Python画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
  2. linux粘着位的使用(t权限)
  3. hyperworks2017安装教程
  4. 彻底学会使用epoll(一)——ET模式实现分析
  5. 穿越鸿蒙电视剧,电视剧大泼猴剧情介绍(1-45全集)
  6. (100)Vivado TCL命令概述
  7. Android轻量级日志管理框架
  8. Jquery WeUI 复选框
  9. 计算机英语词汇汇总,计算机英语词汇汇总
  10. Windows任务管理器命令行查进程
  11. DLNA实现本地媒体服务器
  12. 浅谈企业数据安全风险
  13. linux 播放.ev4播放器,ev4文件怎么播放
  14. python渲染光线_在python中为图像添加光照效果
  15. 浅谈IC卡与ID卡重大区别
  16. leaflet显示高程
  17. 深度爆料——剖析揭露IT培训行业黑幕
  18. docker 搭建响应式个人博客
  19. VS2010中MSCOMM 串口通信控件的注册使用
  20. 系统多个版本excel的切换

热门文章

  1. 【CodeForces 577C】Vasya and Petya’s Game
  2. 实施Exchange 2013中的 MailTip
  3. jdk8之lambda
  4. Shell练习题(持续更新)
  5. socket编程资料-网络收集
  6. 完美:C# Blazor中显示Markdown并添加代码高亮
  7. C# 图像模板匹配并标注
  8. NET问答: 如何使用 C# 自动化关闭电脑 ?
  9. NET问答: 有最干净利落的读写文件方式吗?
  10. .netcore 极速接入第三方登录