当前位置:首页 > Web开发 > 正文

AOP in .NET

2024-03-31 Web开发

标签:

aop in .net

AOP是所有现代OOP语言开发框架中城市具备的对象,跟着Spring框架的普及,这个对象已经被玩烂了。可是很多人仿照照旧处于知其然不知其所以然的状态。本文将基于.NET环境探讨实现AOP的底层道理。

文中部分代码样例截图摘自Matthew D. Groves的《AOP in .NET》,保举大家采办阅读。

中间件与过滤器道理截图摘自微软官方文档,请检察文中链接。

技术图片

本文主要分为以下部分:

根本观点

ASP.NET Core框架内置的AOP

中间件

过滤器

AOP in .NET

织入

代办代理模式

PostSharp与动态代办代理的区别

动态代办代理模式

Castle.DynamicProxy

Autofac + Castle.DynamicProxy

根本观点

面向东西编程通过类的担任机制来复用代码,这在大大都情况下这很有用。但是跟着软件系统的越来庞大,呈现了一些通过OOP措置惩罚惩罚起来相当吃力的存眷点,好比:日志记录,权限控制,缓存,数据库事务提交等等。它们的措置惩罚惩罚逻辑分手于各个模块,各个函数之中,这违反了Don‘t Repeat Yourself以及存眷度点疏散原则,倒霉于后期的代码维护。所谓AOP(面向切面编程),就是将这些存眷点,看作一个个切面,捕获这些切面并将其措置惩罚惩罚措施模块化的过程。

ASP.NET Core框架内置的AOP

在.ASP.NET Core框架中,微软内置了一些措置惩罚惩罚AOP逻辑的机制。可惜的是它内置的IoC框架,不撑持语言级另外AOP。

中间件机制

技术图片

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write

ASP.NET Core框架自己就是由一系列中间件构成的,它自己内置的异常措置惩罚惩罚,路由转发,权限控制,也就是在上述图中的请求管道中实现的。所以我们也完全可以基于中间件机制,实现AOP。

以异常措置惩罚惩罚为例,我可以将try catch插手到next要领的前后,以捕获后续运行过程中未措置惩罚惩罚的异常,并进行统一措置惩罚惩罚。代码如下:

public class ExceptionHandlerMiddleware { private readonly RequestDelegate _next; public ExceptionHandlerMiddleware(RequestDelegate next ) { _next = next; } public async Task Invoke(HttpContext context, IHostingEnvironment env,ILogger<ExceptionHandlerMiddleware> logger) { try { await _next(context); } catch (Exception ex) { logger.LogError(new EventId(ex.HResult), ex, ex.Message); await context.HandleExceptionAsync(ex, env.IsDevelopment()); } } } 过滤器机制

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters

过滤器素质上是由路由中间件(Routing Middleware)的请求管道实现的,如下图所示。

技术图片

开发者通过界说并注册相应的过滤器,就能基于这个请求管道,来措置惩罚惩罚对应的存眷点。Asp.NET Core 的过滤器执行挨次如下图:

技术图片

我们可以基于中间件或者过滤器机制,完成简单的开发。可惜的是,这些并不是语言级另外aop。asp.net core是一个开发框架,它为了便利你开发,给你内置了一些条条框框,你照着做确实能够解决大部分问题。但是脱离了它,该如何实现AOP呢?

AOP in .NET

下面我们开始真正进入主题。

织入

技术图片

要实现AOP,关键在于织入(“weaving”)。如上图代码中,LogAspect被织入到BusinessModule1中,Mehtod1在执行前后,就会分袂挪用BeginMethod以及EndMethod要领来措置惩罚惩罚日志记录逻辑。LogAspect如果能够织入到所有需要日志记录的要领中,我们就将分手的日志措置惩罚惩罚代码模块化成了一个统一的切面措置惩罚惩罚措施:LogAspect。这就是AOP。实现织入的方法分为两种:编译时织入、运行时织入。

当你使用C#创建.NET项目时,该项目将被编译为CIL(也称为MSIL,IL和bytecode)作为措施集(DLL或EXE文件)。 下图说明了这个过程。然后,大众语言运行时(CLR)可以将CIL转换成真实的机器指令(通过称为即时编译的过程,或JIT)。

《aop in .net》

技术图片

所谓编译时织入,就是对编译孕育产生的CIL做手脚,通过改削编译好的CIL文件,来到达织入的效果,如下图所示。编译时织入可通过PostSharp实现。

技术图片

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/29327.html