zoukankan      html  css  js  c++  java
  • 静态实现AOP(翻译自MSDN)

    在.net实现AOP

    本文通过一个简单的例子实现静态AOP.改例子主要实现客户的增删改查,突然有一天你的老板需要在程序上跟踪每个方法操作的运行日志。

    主要分为5个步骤。

    第一步:创建接口IRepository<T>,代码定义如下:


        public interface IRepository<T>
        {
          void Add(T entity);
          void Delete(T entity);
          void Update(T entity);
          IEnumerable<T> GetAll();
          T GetById(int id);
        }

    第2步: 创建Repository<T>类,实现代码IRepository<T>,代码如下:


        public class Repository<T> : IRepository<T>
        {
          public void Add(T entity)
          {
        Console.WriteLine("Adding {0}", entity);
          }
          public void Delete(T entity)
          {
        Console.WriteLine("Deleting {0}", entity);
          }
          public void Update(T entity)
          {
        Console.WriteLine("Updating {0}", entity);
          }
          public IEnumerable<T> GetAll()
          {
        Console.WriteLine("Getting entities");
        return null;
          }
          public T GetById(int id)
          {
        Console.WriteLine("Getting entity {0}", id);
        return default(T);
          }
        }

    第3步,用Repository<T>实现Customer 的增删改查,Customer 定义如下:


        public class Customer
        {
          public int Id { get; set; }
          public string Name { get; set; }
          public string Address { get; set; }
        }

    第4步,在控制台程序,运行,代码看起来如下:


        static void Main(string[] args)
        {
          Console.WriteLine("*** Begin program - no logging ");
          IRepository<Customer> customerRepository =new Repository<Customer>();
          var customer = new Customer
          {
            Id = 1,
            Name = "Customer 1",
            Address = "Address 1"
          };
          customerRepository.Add(customer);
          customerRepository.Update(customer);
          customerRepository.Delete(customer);
          Console.WriteLine(" End program - no logging ***");
          Console.ReadLine();
        }

    按F5运行,运行结果如下图:

    image

    现在假如你的老板,需要在类中增加日志功能,你可以新建一个LoggerRepository<T>类,让他同样实现IRepository<T>,代码如下:


        public class LoggerRepository<T> : IRepository<T>
        {
          private readonly IRepository<T> _decorated;
          public LoggerRepository(IRepository<T> decorated)
          {
                _decorated = decorated;
          }
          private void Log(string msg, object arg = null)
          {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(msg, arg);
            Console.ResetColor();
           }
          public void Add(T entity)
          {
            Log("In decorator - Before Adding {0}", entity);
            _decorated.Add(entity);
            Log("In decorator - After Adding {0}", entity);
          }
          public void Delete(T entity)
          {
            Log("In decorator - Before Deleting {0}", entity);
            _decorated.Delete(entity);
            Log("In decorator - After Deleting {0}", entity);
          }
          public void Update(T entity)
          {
            Log("In decorator - Before Updating {0}", entity);
            _decorated.Update(entity);
            Log("In decorator - After Updating {0}", entity);
          }
          public IEnumerable<T> GetAll()
          {
            Log("In decorator - Before Getting Entities");
            var result = _decorated.GetAll();
            Log("In decorator - After Getting Entities");
            return result;
          }
          public T GetById(int id)
          {
            Log("In decorator - Before Getting Entity {0}", id);
            var result = _decorated.GetById(id);
            Log("In decorator - After Getting Entity {0}", id);
            return result;
          }
        }


    这个新类,已经包装了包装类,实现日志记录功能,现在需要做小的改动,代码实现如下:

    static void Main(string[] args)
        {
          Console.WriteLine("*** Begin program - logging with decorator ");
          // IRepository<Customer> customerRepository =
          //   new Repository<Customer>();
          IRepository<Customer> customerRepository =
        new LoggerRepository<Customer>(new Repository<Customer>());
          var customer = new Customer
          {
            Id = 1,
            Name = "Customer 1",
            Address = "Address 1"
          };
          customerRepository.Add(customer);
          customerRepository.Update(customer);
          customerRepository.Delete(customer);
          Console.WriteLine(" End program - logging with decorator ***");
          Console.ReadLine();
        }


    继续运行,运行结果如下:

    image

    到此为止,你可能会想:OK,这个想法是好的,但它仍然需要做很多工作:我必须实现所有的类和添加方面的所有方法。这将是难以维护。

    有另一种方式去做吗?.net框架,您可以使用反射来得到所有方法和执行它们。基类库(BCL)甚至有RealProxy类(bit.ly/18MfxWo),为你实现。

    答案:是的有的就是我们所讲的动态代理实现AOP; 我们将在下一节讲

    AOP参考

    本文翻译自 :https://msdn.microsoft.com/en-us/magazine/dn574804.aspx(面向切面编程)

  • 相关阅读:
    nodejs程序发布的jenkins自动化脚本和问题记录
    jenkins代码rsync推送脚本带日志记录和代码分机房处理示例
    django入门到精通⑥消息管理器的升级处理,对关键词进行过滤示例
    django入门到精通⑤mako模板的使用
    django入门到精通④jinja2模板的使用
    django入门到精通③template模板功能和常用标签过滤器的使用
    hdfs副本调整不生效
    macOS 系统中,开发工具列表
    查看系统中安装了哪些python版本
    -p py, --python py target interpreter for which to create a virtual (either absolute path or identifier string) 中 identifier string 的含义
  • 原文地址:https://www.cnblogs.com/DripRoad/p/5596661.html
Copyright © 2011-2022 走看看