asp.net core的AOP记录
序曲:学习编程最好的方式就是敲代码,没有比这个更好的方法,哪怕你看了上百G的视频,都不如你自己敲几行代码更为有效。还有要记得敲完代码然后写一篇随笔来记录一下你所学所想。
什么叫AOP?
AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
运用场景?
比较常见的场景是:日志记录,错误捕获、性能监控等 AOP的本质是通过代理对象来间接执行真实对象,在代理类中往往会添加装饰一些额外的业务代码。
下面通过代码来说明一下,本文举例比较简单的案例来说明,若有错误,多谢指点。
建立一个asp.net core的控制台程序来演示
利用Nuget引入相关的包文件
如图所示:
第一个拦截器的引用包 AspectCore.Extensions.DependencyInjection
第二个是依赖注入的包 Microsoft.Extensions.DependencyInjection
创建一个接口:
using System; using System.Collections.Generic; using System.Text; namespace AOP_Demo { public interface IMysql { void Select(int i); } }
创建一个实现类
using System.Collections.Generic; using System.Text; namespace AOP_Demo { class Mysql : IMysql { [MyLogInterceptor] public void Select(int i) { Console.WriteLine("查询的结果是:"+i); } } }
创建一个日志拦截器
using AspectCore.DynamicProxy; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace AOP_Demo { public class MyLogInterceptorAttribute : AbstractInterceptorAttribute { public override Task Invoke(AspectContext context, AspectDelegate next) { Console.WriteLine("方法执行前的日志"); var task = next(context); Console.WriteLine("方法执行后的日志"); return task; } } }
然后在程序入口处编写相关代码
using Microsoft.Extensions.DependencyInjection; using System; using AspectCore.Extensions.DependencyInjection; using AspectCore.Configuration; namespace AOP_Demo { class Program { static void Main(string[] args) { ServiceCollection serviceDescriptors = new ServiceCollection(); //配置动态代理 serviceDescriptors.ConfigureDynamicProxy(config => { config.Interceptors.AddTyped<MyLogInterceptorAttribute>(); }); //注册服务 serviceDescriptors.AddTransient<IMysql, Mysql>(); //提供者 IServiceProvider serviceProvider = serviceDescriptors.BuildDynamicProxyServiceProvider(); //获得服务 var Provider= serviceProvider.GetService<IMysql>(); //调用方法 Provider.Select(1); Console.ReadKey(); } } }
上面代码中,我们需要把拦截器通过动态代理的方式注入到IOC容器中。
所思:面向切面就是在原来的服务上添加一点新的功能,而且这个添加的功能还不能对原来的代码进行大改特改,尽可能的降低新功能和原来功能的耦合性,我觉得可以很好的运用在日志,异常处理等方面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?