编程思想—面向切面编程(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揭秘》
原文地址:https://www.cnblogs.com/Lyunwen/p/5579709.html