通过上面演示,原生的动态代理实现面向切面编程显得相对麻烦,比如强制转换、传递类型等操作;常用的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.Create<IUserService, MyProxy>(); //2. 因为调用的是实例方法,需要传提具体类型 ((MyProxy)userService1).TargetClass = new UserService(); userService1.AddUser(user); Console.WriteLine("=============Castle.Core方式=============="); //先实例化一个代理类生成器 ProxyGenerator generator = new ProxyGenerator(); //通过代理类生成器创建 var u = generator.CreateInterfaceProxyWithTarget<IUserService>(new UserService(), new MyIntercept()); u.AddUser(user); Console.ReadLine(); } } }运行效果如下:
Autofac集成了Castle.Core用着也挺不错;
Autofac已经集成了Castle.Core啦,在聊MemoryCache的时候就已经用到,使用比较简单,可以通过特性标注的方式就可以针对某个类或接口的方法进行拦截加强,详情请参考这篇文章()。
3. 应用场景AOP思想是很优秀,但总不能处处都得用吧,需根据业务来评估是否需要;常用应用场景大概有以下几个:
安全控制:通常在Web开发的时候,会使用过滤器或拦截器进行权限验证,这也是AOP思想的落地;对于客户端程序,通过上述演示的几种方式可以轻松实现权限的统一管理和验证;
事务处理:相信小伙伴都写过数据库事务代码吧,常规做法就是在业务方法中直接开启事务,执行完成,提交或回滚即可,AOP思想也能很好处理这种情况;
异常处理:统一的异常处理是最好的选择,除非是特殊的业务;通常Web有异常过滤器,客户端程序可以用上述几种方式;
日志记录:目前来说日志记录应该是作为系统功能的一部分,AOP统一记录是不错的选择;
性能统计:以AOP的思想对方法进行前后监控,从而可以分析其执行性能;
缓存处理:缓存处理,如上次说到MemoryCache,加上AOP拦截应用,系统效率提升不错哦
业务辅变主不变:主业务变,但会不定时增加辅助需求的场景,比如增加用户,后续可能在用户新增成功之后会增加邮件通知、推送新用户信息等功能。
源码地址:https://github.com/zyq025/DotNetCoreStudyDemo
总结先暂时聊这么多吧,瞌睡啦,小伙伴们晚安喽!!!
一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~