AOP(面向切面编程)大概了解一下

上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程。

正文 1. 概述

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

---来自百度百科

总结优点

对业务逻辑的各个部分进行隔离,业务之间耦合度降低;

提高程序的可重用性,同时程序更容易维护;

提高开发效率,不用花大量的时间在业务中增加代码,还能降低风险;

其实AOP的本质就是动态代理,何为动态代理呢?

动态代理就是在程序运行时,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。通俗一点来说就是在运行期间对方法的拦截,在方法执行前后进行额外的业务处理,从而在不嵌入原有代码逻辑情况下就能增强被拦截方法的业务能力。

理论先到这,一起来看看用代码怎么实现吧?

2. 实践检验真理(到底优不优秀)

先来一个控制台项目,什么都没有,从头开始撸代码,先来看看项目结构:

图片

老案例了,还是假装在进行用户维护,模拟对用户进行增删改查。这次就直接上代码啦啊,根据项目结构依次看看代码:

在AopModel中增加User.cs

public class User { public string Name { get; set; } public int Age { get; set; } }

在AopService中增加IUser.cs和User.cs

IUserService.cs

public interface IUserService { bool AddUser(User user); }

UserService.cs

public 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 { // 继承DispatchProxy public 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.Create<IUserService, MyProxy>(); //2. 因为调用的是实例方法,需要传提具体类型 ((MyProxy)userService1).TargetClass = new UserService(); userService1.AddUser(user); Console.ReadLine(); } }

动态代理就实现需求功能啦,可以在用户增加前或后都进行相关需求处理,运行看效果:

图片

第三方库Castle.Core封装的美滋滋;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdssd.html