AOP:面向切面编程,在不破坏原有代码的情况下,提供新的功能。可以使用AOP添加通用功能,比如事务、日志、权限、异常、缓存...
常见的AOP:
MVC中的过滤器、HttpModule...
如何实现AOP:
1、装饰器模式,装饰器模式就是为对象动态扩展新功能,并且不修改原有类,所以它算是AOP,但是成本高(静态)
2、使用动态代理,动态创建对象。(动态)
3、DI框架中,由于对象是通过容器创建的,所以很容易实现AOP
案例1,动态代理实现AOP:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using Castle.DynamicProxy;//Castle.Core 8 9 namespace MyAOP 10 {//业务类接口 11 public interface IUserProcessor 12 { 13 void RegUser(User user); 14 } 15 //业务类 16 public class UserProcessor : IUserProcessor 17 { 18 /// <summary> 19 /// 必须带上virtual 20 /// </summary> 21 /// <param name="user"></param> 22 public virtual void RegUser(User user) 23 { 24 Console.WriteLine($"用户已注册。Name:{user.Name},PassWord:{user.Password}"); 25 } 26 } 27 //AOP逻辑 28 public class MyInterceptor : IInterceptor 29 { 30 public void Intercept(IInvocation invocation) 31 { 32 PreProceed(invocation); 33 invocation.Proceed(); 34 PostProceed(invocation); 35 } 36 public void PreProceed(IInvocation invocation) 37 { 38 Console.WriteLine("方法执行前"); 39 } 40 41 public void PostProceed(IInvocation invocation) 42 { 43 Console.WriteLine("方法执行后"); 44 } 45 } 46 }
1 var interceptor = new MyInterceptor(); 2 UserProcessor userprocessor = new ProxyGenerator().CreateClassProxy<UserProcessor>(interceptor); 3 userprocessor.RegUser(new User 4 { 5 Name = "aaa", 6 Password = "123456" 7 });