zoukankan      html  css  js  c++  java
  • 编程思想—面向切面编程(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揭秘》
  • 相关阅读:
    鲸云效总结自动化测试常见问题
    鲸云效解析自动化测试前期的准备很重要
    鲸云效为小程序上线做兼容性审核
    ADO.NET删除和修改
    GIT常用操作命令
    随笔
    你应该知道的计算机延迟数字
    centos安装dotnet-sdk-3.1出现no package问题
    Linux CentOS7.9安装Docker
    CentOS6.8配置IP
  • 原文地址:https://www.cnblogs.com/Lyunwen/p/5579709.html
Copyright © 2011-2022 走看看