编程思想—面向切面编程(AOP)
谈到面向切面的编程,我们很容易关联到面向对象编程(OOP)。个人对这两种编程方式的解释为:两种编程思想只是站在编程的角度问题。
OOP注重的是对象,怎么对对象行为和方法的抽象。如何封装一个具有完整属性以及行为的对象。简单来讲,其实OOP是对一个名词的封装。
AOP注重的是行为,怎么对业务逻辑的行为进行划分。如何在逻辑复杂的系统中逻辑划分(领域划分,模块划分,读取划分等)。简单来讲,其实AOP是对一系列逻辑操作的分类。
代码示例:
定义用户User:
public class User { public int Id{get;set;} public int Age{get;set;} public string Name{get;set;} }
对用户的操作我们可以抽象出一个获取用户信息的切面IGetUser
public interface IGetUser { User GetUserById(int Id); IEnumerable<User> GetUsers(); }
实现切面IGetUser的类DefaultGetUser
public class DefaultGetUser:IGetUser { public User GetUserById(int id) { return new User{Id=1,Age=18,Name="TestName"}; } public IEnumerable<User> GetUsers() { List<User> users=new List<User>(); for(var i=0;i<10;i++) { result.Add(new User{Id=i,Age=i*10,Name=String.Format("TestName{0}",i)}); } return result; } }
设置代理对象,代理方式可以是单个切面,也可以是一系列有某种关联的切面
public class GetUserProxy:IGetUser { private IGetUser _getUserService; private ILog _log; public GetUserProxy(IGetUserService getUserService,ILog log) { _getUserService=getUserService; _log=log; } public User GetUserById(int id) { return _getUserService.GetUserById(id); } public User GetUsers() { var result= _getUserService.GetUsers(); //代理类逻辑填充 System.Threading.Tasks.Task.Factory.StartNew(()=>_log.Log("p批量读取用户信息"));
return result; } }
最后就是上层对代理类的调用了,因为代理类中注入了关联的切面接口。我们可以考虑使用IOC框架来实例化代理,当然也可以自己通过反射方式注入代理类构造参数来实例化代理类。
不同的IOC框架实现方式不一样,如果只是简单的测试可以考虑StructMap,Autofac等。
Spring.Net 对AOP 的诠释更为全面推荐了解Spring.Net;
ASP.NET 方面极力推荐 (美) Stephen Walther 的《ASP.NET 4揭秘》