杭州 做网站,建设部网站造价咨询,建设网站方法有哪些内容,个人游戏网站备案前言上一篇在聊MemoryCache的时候#xff0c;用到了Autofac提供的拦截器进行面向切面编程#xff0c;很明显能体会到其优势#xff0c;既然涉及到了#xff0c;那就趁热打铁#xff0c;一起来探探面向切面编程。正文1. 概述在软件业#xff0c;AOP为Aspect Oriented Prog… 前言上一篇在聊MemoryCache的时候用到了Autofac提供的拦截器进行面向切面编程很明显能体会到其优势既然涉及到了那就趁热打铁一起来探探面向切面编程。正文1. 概述在软件业AOP为Aspect Oriented Programming的缩写意为面向切面编程通过预编译方式和运行期间动态代理实现程序功能统一维护的一种技术。AOP是OOP(面向对象程序设计)的延续是软件开发中的一个热点是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离从而使得业务逻辑各部分之间的耦合度降低提高程序的可重用性同时提高了开发的效率。---来自百度百科总结优点对业务逻辑的各个部分进行隔离业务之间耦合度降低提高程序的可重用性同时程序更容易维护提高开发效率不用花大量的时间在业务中增加代码还能降低风险其实AOP的本质就是动态代理何为动态代理呢动态代理就是在程序运行时创建目标对象的代理对象并对目标对象中的方法进行功能性增强的一种技术。通俗一点来说就是在运行期间对方法的拦截在方法执行前后进行额外的业务处理从而在不嵌入原有代码逻辑情况下就能增强被拦截方法的业务能力。理论先到这一起来看看用代码怎么实现吧2. 实践检验真理(到底优不优秀)先来一个控制台项目什么都没有从头开始撸代码先来看看项目结构老案例了还是假装在进行用户维护模拟对用户进行增删改查。这次就直接上代码啦啊根据项目结构依次看看代码在AopModel中增加User.cspublic class User
{public string Name { get; set; }public int Age { get; set; }
}
在AopService中增加IUser.cs和User.csIUserService.cspublic interface IUserService
{bool AddUser(User user);
}
UserService.cspublic class UserService : IUserService
{public bool AddUser(User user){Console.WriteLine(用户添加成功);return true;}
}
Main方法class Program
{static void Main(string[] args){Console.WriteLine(原始需求);User user new User { Name Zoe, Age 18 };IUserService userService new UserService();// 模拟增加一个用户userService.AddUser(user);Console.ReadLine();}
}
这样项目就正常运行啦这个就不用我截图了吧小伙伴都会吧。项目运行正常但需要加一个需求用户增加成功之后进行邮件发送通知。目前有两种解决方案直接在增加用户方法中添加加发送邮件逻辑(相信很多小伙伴是这样做的见效快还简单)如果频繁在增加用户前或后添加新需求呢还继续加吗可能到最后增加用户的方法变得很复杂后期也不好维护如果要去掉某一个功能又得把代码改回来作为程序员是不是又要和产品同事搞架啦(文明人不动手)当然如果需求固定这种方式也不错。面向切面实现即在不影响原有代码逻辑的情况动态的对方法进行拦截在方法执行前或后添加业务即可。项目中引入AOP(面向切面编程)思想原始动态代理实现先来加个代理类如下using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace Aop
{// 继承DispatchProxypublic class MyProxy : DispatchProxy{//具体类型public object TargetClass { get; set; }protected override object Invoke(MethodInfo targetMethod, object[] args){Console.WriteLine(增加用户前执行业务);//调用原有方法targetMethod.Invoke(TargetClass, args);Console.WriteLine(增加用户后执行业务);return true;}}
}
然后在Main函数直接使用即可如下class Program
{static void Main(string[] args){//原始需求User user new User { Name Zoe, Age 18 };IUserService userService new UserService();userService.AddUser(user);Console.WriteLine(动态代理 实现新需求);//1. 创建代理对象IUserService userService1 DispatchProxy.CreateIUserService, MyProxy();//2. 因为调用的是实例方法需要传提具体类型((MyProxy)userService1).TargetClass new UserService();userService1.AddUser(user);Console.ReadLine();}
}
动态代理就实现需求功能啦可以在用户增加前或后都进行相关需求处理运行看效果第三方库Castle.Core封装的美滋滋通过上面演示原生的动态代理实现面向切面编程显得相对麻烦比如强制转换、传递类型等操作常用的Castle.Core将动态代理进一步封装使用就相对方便点啦这次定义一个拦截器即可using Castle.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Text;namespace Aop
{// 自定义拦截器public class MyIntercept : IInterceptor{public void Intercept(IInvocation invocation){//执行原有方法之前Console.WriteLine(增加用户前执行业务);//执行原有方法invocation.Proceed();//执行原有方法之后Console.WriteLine(增加用户后执行业务);}}
}
Main函数中使用拦截器即可如下using AopModel;
using AopService;
using Castle.DynamicProxy;
using System;
using System.Reflection;
using System.Reflection.Metadata;namespace Aop
{class Program{static void Main(string[] args){Console.WriteLine(原始需求);User user new User { Name Zoe, Age 18 };IUserService userService new UserService();// 模拟增加一个用户userService.AddUser(user);Console.WriteLine(动态代理 实现新需求);//1. 创建代理对象IUserService userService1 DispatchProxy.CreateIUserService, MyProxy();//2. 因为调用的是实例方法需要传提具体类型((MyProxy)userService1).TargetClass new UserService();userService1.AddUser(user);Console.WriteLine(Castle.Core方式);//先实例化一个代理类生成器ProxyGenerator generator new ProxyGenerator();//通过代理类生成器创建var u generator.CreateInterfaceProxyWithTargetIUserService(new UserService(), new MyIntercept());u.AddUser(user);Console.ReadLine();}}
}
运行效果如下Autofac集成了Castle.Core用着也挺不错Autofac已经集成了Castle.Core啦在聊MemoryCache的时候就已经用到使用比较简单可以通过特性标注的方式就可以针对某个类或接口的方法进行拦截加强详情请参考这篇文章(因MemoryCache闹了个笑话)。3. 应用场景AOP思想是很优秀但总不能处处都得用吧需根据业务来评估是否需要常用应用场景大概有以下几个安全控制通常在Web开发的时候会使用过滤器或拦截器进行权限验证这也是AOP思想的落地对于客户端程序通过上述演示的几种方式可以轻松实现权限的统一管理和验证事务处理相信小伙伴都写过数据库事务代码吧常规做法就是在业务方法中直接开启事务执行完成提交或回滚即可AOP思想也能很好处理这种情况异常处理统一的异常处理是最好的选择除非是特殊的业务通常Web有异常过滤器客户端程序可以用上述几种方式日志记录目前来说日志记录应该是作为系统功能的一部分AOP统一记录是不错的选择性能统计以AOP的思想对方法进行前后监控从而可以分析其执行性能缓存处理缓存处理如上次说到MemoryCache加上AOP拦截应用系统效率提升不错哦业务辅变主不变主业务变但会不定时增加辅助需求的场景比如增加用户后续可能在用户新增成功之后会增加邮件通知、推送新用户信息等功能。源码地址https://github.com/zyq025/DotNetCoreStudyDemo总结先暂时聊这么多吧瞌睡啦小伙伴们晚安喽一个被程序搞丑的帅小伙关注Code综艺圈跟我一起学~~~图片