一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点。

本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),DynamicProxy(动态代理方式,JAVA上早已不是新鲜事),Middleware(netcore中间件所实现的AOP方式)

什么是AOP编程

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

换白话文就是:保证开闭原则的前提下,不修改某一个模块(或函数)的任何一行代码,从而实现对该模块的横向扩展。

可插拔:即使抛弃AOP,核心内容仍然可以运行,降低耦合,提高可重用。

创建一个“能说你好,某某某”的ASP .NET CORE WebApi项目

创建项目步骤此处略过,呵呵。

我们假定一个最简单的“Say Hello”作为项目需求,通过URL传递姓名,再返回“hello {name}”。因此创建一个简单模型PeopleModel,创建一个接口ISay,并用Say实现ISay中的“hello {name}”功能。

1     public interface ISay
2     {
3         PeopleModel SayHello(PeopleModel peopleModel);
4     }

1     public class Say : ISay
2     {
3         public PeopleModel SayHello(PeopleModel peopleModel)
4         {
5             peopleModel.Name = $"hello {peopleModel.Name}";
6             return peopleModel;
7         }
8     }

1     public class PeopleModel
2     {
3         public string Name { get; set; } = "";
4         public int Age { get; set; }
5         public int Sex { get; set; }
6     }

再创建一个MVC控制器

 1     [Route("api/[controller]")]
 2     [ApiController]
 3     public class DemoController : ControllerBase
 4     {
 5         [HttpGet]
 6         public PeopleModel Get([FromQuery] PeopleModel peopleModel)
 7         {
 8             return Say.SayHello(peopleModel);
 9         }
10     }

很简单的,不做解释,以免浪费篇幅。

DynamicProxy方式

动态代理的方式在JAVA上很早就出现了,比如在Spring框架里面。而NET中利用Autofac和Castle这两个框架同样也可以实现动态代理。

需要用到的框架如下:

Autofac:提供容器控制
Autofac.Extensions.DependencyInjection:对autofac依赖注入进行扩展
Autofac.Extras.DynamicProxy:对autofac动态代理进行扩展
Castle.Core:使用动态代理的实现

相信autofac很多朋友都不陌生了,而配合Castle框架就能实现动态代理模式,我们新建一个拦截器类,名为InjectInterceptor,而且必须要实现IInterceptor(该接口在Castle.DynamicProxy中),完整代码如下:

 1 using System;
 2 using Castle.DynamicProxy;
 3
 4 namespace InterceptDemo.Intercepts.Inject
 5 {
 6     public class InjectInterceptor : IInterceptor
 7     {
 8         public virtual void Intercept(IInvocation invocation)
 9         {
10             PreProceed(invocation);
11             invocation.Proceed();
12             PostProceed(invocation);
13         }
14
15         private void PreProceed(IInvocation invocation)
16         {
17             Console.WriteLine($"{DateTime.Now} inject interceptor invoke preproceed");
18         }
19
20         private void PostProceed(IInvocation invocation)
21         {
22             Console.WriteLine($"{DateTime.Now} inject interceptor invoke postproceed");
23         }
24     }
25 }

当继承IInterceptor接口时,必须要实现Intercept虚方法,该方法将传递IInvocation接口参数,调用Proceed函数将会实现方法体以外的函数,就是切面以外的函数。使用时只需要通过特性即可实现AOP方式,我们稍微修改一下Say这个类,增加一句话:[Intercept(typeof(InjectInterceptor))]

当然,还需要在autofac中实现注册才行,代码如下:

var builder = new ContainerBuilder();
builder.Populate(services);
builder.RegisterType<Say>().As<ISay>().EnableInterfaceInterceptors();
builder.RegisterType<InjectInterceptor>();

Filter方式

过滤器的方式就更加简单了,在ASP.NET框架中,使用过滤器的地方非常非常的多,笔者不作一一介绍,直接贴代码:

 1     public class ActionFilter : ActionFilterAttribute
 2     {
 3         public override void OnActionExecuting(ActionExecutingContext context)
 4         {
 5             Console.WriteLine($"{DateTime.Now} on action exceuting");
 6         }
 7
 8         public override void OnActionExecuted(ActionExecutedContext context)
 9         {
10             Console.WriteLine($"{DateTime.Now} on action exceuted");
11         }
12     }

Middleware方式

中间件不仅可以实现自定义管道,还也可以作为netcore invoke的AOP编程。我们先建立一个对ApplicationBuilder的扩展类

1     public static class InterceptHandler
2     {
3         public static IApplicationBuilder UseInterceptMiddleware(this IApplicationBuilder app)
4         {
5             return app.UseMiddleware<InterceptMiddlware>();
6         }
7     }

再建立一个中间件

 1 using System;
 2 using System.Threading.Tasks;
 3 using Microsoft.AspNetCore.Http;
 4
 5 namespace InterceptDemo.Intercepts.Middleware
 6 {
 7     public class InterceptMiddlware
 8     {
 9         private readonly RequestDelegate _next;
10
11         public InterceptMiddlware(RequestDelegate next)
12         {
13             _next = next;
14         }
15
16         public async Task Invoke(HttpContext context)
17         {
18             PreProceed(context);
19             await _next(context);
20             PostProceed(context);
21         }
22
23         private void PreProceed(HttpContext context)
24         {
25             Console.WriteLine($"{DateTime.Now} middleware invoke preproceed");
26         }
27
28         private void PostProceed(HttpContext context)
29         {
30             Console.WriteLine($"{DateTime.Now} middleware invoke postproceed");
31         }
32     }
33 }

运行结果如下

总结一下

在NETCORE中可以使用AOP的方式有很多很多,包括国内优秀的开源框架asp.netcore同样可以实现AOP编程模式。

笔者所提供的三种AOP方式可适用如下

Filter:身份验证,参数验证,处理耗时等等WEB处理级的服务。

DynamicProxy:功能模块之间的解耦和重用服务。

Middleware:Request和Response之间建立的通信等底层服务,必要时还可以实现自定义管道。

感谢阅读!

源码地址:https://github.com/steveleeCN87/C-.three.aop.programming

转载于:https://www.cnblogs.com/SteveLee/p/three_aop_programming.html

在.NET Core中三种实现“可插拔”AOP编程方式(附源码)相关推荐

  1. 酷毙了!三种风格的全屏幻灯片效果【附源码下载】

    今天,我们想向您展示如何创建平铺背景图像的幻灯片效果.其灵感来自于国外的一个工作室网站(围观),这个网站充满了各种有趣和创意效果,一定记得去看看. 这个幻灯片效果是由四个区域的独立移动构成,通过画面分 ...

  2. java乘法表_Java中四种9*9乘法表的实现方式(附代码)

    前言: 初学java,实现99乘法表是必学必会的内容. 需求 : 分别写出上下左右,对应四个角的乘法表. 思路: 可以先打印出*星星,形成一个直角三角形,然后再替换成乘法公式. 代码如下: publi ...

  3. 通用权限管理系统组件 中集成多个子系统的单点登录(网站入口方式)附源码

    通用权限管理系统组件 (GPM - General Permissions Manager) 中集成多个子系统的单点登录(网站入口方式)附源码 上文中实现了直接连接数据库的方式,通过配置文件,自定义的 ...

  4. Servlet的Web应用---三种方法获取表单的各种属性(源码)

    闲话少说,切入正题. 一.最通俗的方法:request.getParameter("name属性") 源码: public void doPost(HttpServletReque ...

  5. 【Android App】人脸识别中使用Opencv比较两张人脸相似程度实战(附源码和演示 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.比较两张人脸的相似程度 直方图由一排纵向的竖条或者竖线组成,横轴代表数据类型,纵轴代表数据多少. 图像直方图经常应用于特征提取.图像匹配等方面. ...

  6. 【MapBox】5种地图(底图)样式自由切换附源码

    文章目录 一.不同地图显示样式 1. 卫星 2. 浅色 3. 深色 4. 街道 5. 户外 二.完整源码 一.不同地图显示样式 MapBox提供了5种不同形式的地图显示样式: 1. 卫星 2. 浅色

  7. Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)

    需要源码和图片集请点赞关注收藏后评论区留言~~~ 一.PDF文件渲染器 Android集成了PDF的渲染操作,从很大程度上方便了开发者,这个PDF文件渲染器便是PdfRenderer.渲染器允许从存储 ...

  8. C++中的开闭原则使用C++多态功能实现附源码

    开闭原则 使用开闭原则之前一个银行柜员会将所有的工作都操作一遍,这样会大大降低办事的效率,而且银行的业务不适合扩展,没扩展一项业务就要培训所有的业务员.改为使用开闭原则之后,每个银行业务员只负责一项业 ...

  9. android中设置ListView的选中的Item的背景颜色(附源码)

    http://longyi-java.iteye.com/blog/976067 ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了 ...

最新文章

  1. 【计算理论】计算理论总结 ( 图灵机设计示例 ) ★★
  2. 人工智能学习--文本检测实践
  3. 谷歌Deep Bootstrap Framework:在线优化角度理解神经网络
  4. junit jndi_使用Spring创建用于JUnit测试的JNDI资源
  5. php操作redis_PHP操作Redis的基本方法
  6. MIP开发教程(三) 使用MIP-CLI工具调试组件
  7. php的控制器,php-模块与控制器
  8. Referenced file contains errors (http://JAVA.sun.com/xml/ns/j2ee/web-app_2_5.xsd).
  9. php案例纠错,PHP编程纠错指南
  10. Mac底下java和jre路径
  11. 步步为营 .NET 设计模式学习笔记 三、Strategy(策略模式)
  12. SQL Server 索引使用分析(1)- 索引结构
  13. 看似简单的hashCode和equals面试题,竟然有这么多坑!
  14. 关于ugc的一点思考
  15. 阿里云发布ET环境大脑 对抗雾霾、排污和自然灾害
  16. Android下载PDF文件
  17. 惠普打印机驱动下载安装后不能使用,驱动人生解决方案
  18. 计算机逻辑与 或 非的表达式,计算机算数和,逻辑与,逻辑或,逻辑非分别是什么意思...
  19. 考研英语语法_Day05_状语和状语从句
  20. 双螺杆挤出机有哪些系列

热门文章

  1. bootstrap 模态框垂直居中实现方法
  2. 阅读 Linux 内核源码——共享内存
  3. 最近一月的娱乐生活:看电影,玩游戏
  4. 在mac下安装matplotlib,xlrd
  5. 苹果笔记本电脑电池保养细则
  6. 清华大学郑莉c++答疑
  7. 第一次二刷的电影:工作细胞
  8. learning materials for progress!
  9. canvas的特别棒的feature:badge!!!
  10. 2108889队2021年数学建模美赛C题花絮视频!