AOP(Aspect Oriented Programming) 面向切面编程

起源

引言  http://wayfarer.cnblogs.com/articles/241012.html

AOP技术基础  https://www.cnblogs.com/wayfarer/articles/241024.html

.Net平台AOP技术研究 https://www.cnblogs.com/wayfarer/articles/256909.html

AOP、POP、OOP 区别与联系

POP面向过程编程:符合逻辑思维,线性的处理问题-----无法应付复杂的系统

OOP面向对象编程:万物皆对象,对象交互完成功能,功能叠加成模块,模块组成系统,去搭建复杂的大型软件系统
 类----功能点---模块----系统
 类却是会变化的,增加日志/异常/权限/缓存/事务,只能修改类?
 GOF的23种设计模式,应对变化,核心套路是依赖抽象,细节就可以变化
 但是只能替换整个对象,但是没办法把一个类动态改变

AOP(Aspect):允许开发者动态的修改静态的OO模型,就像现实生活中对象在生命周期中会不断的改变自身。
AOP是一种编程思想,是OOP思想的补充

正是因为能够动态的扩展功能,所以在程序设计时就可以有以下好处:
1 聚焦核心业务逻辑,权限/异常/日志/缓存/事务, 通用功能可以通过AOP方式添加,程序设计简单,
2 功能动态扩展;集中管理,代码复用;规范化;

实现AOP的多种方式
a 静态实现--装饰器/代理模式
b 动态实现--Remoting/Castle(Emit)
c 静态织入--PostSharp(收费)--扩展编译工具,生成的加入额外代码
d 依赖注入容器的AOP扩展(开发)
e MVC的Filter--特性标记,然后该方法执行前/后就多了逻辑  invoker调用中心--负责反射调用方法--检查特性--有则执行额外逻辑

A 装饰器模式实现静态代理-AOP 在方法前后增加自定义的方法

  1. public class Business : IBusiness
  2. {
  3. public virtual void DoSomething()
  4. {
  5. Console.WriteLine("DoSomething");
  6. }
  7. }
  8. public class BusinessAOP : IBusiness
  9. {
  10. public BusinessAOP(IBusiness IBusiness)
  11. {
  12. this._IBusiness = IBusiness;
  13. }
  14. private IBusiness _IBusiness;
  15. public override void DoSomething()
  16. {
  17. BeforeProceed();
  18. this._IBusiness.DoSomething();
  19. AfterProceed();
  20. }
  21. /// <summary>
  22. /// 业务逻辑之前
  23. /// </summary>
  24. /// <param name="user"></param>
  25. private void BeforeProceed()
  26. {
  27. Console.WriteLine("方法执行前");
  28. }
  29. /// <summary>
  30. /// 业务逻辑之后
  31. /// </summary>
  32. /// <param name="user"></param>
  33. private void AfterProceed()
  34. {
  35. Console.WriteLine("方法执行后");
  36. }
  37. }
  38. public interface IBusiness
  39. {
  40. void DoSomething();
  41. }
  42. //前端调用
  43. new BusinessAOP(new Business()).DoSomething();

B 代理模式实现静态代理-AOP 在方法前后增加自定义的方法

  1. public class Business : IBusiness
  2. {
  3. public void DoSomething()
  4. {
  5. Console.WriteLine("DoSomething");
  6. }
  7. }
  8. public class ProxyBusinessAOP : IBusiness
  9. {
  10. private IBusiness _IBusiness=new Business();
  11. public void DoSomething()
  12. {
  13. BeforeProceed();
  14. this._IBusiness.DoSomething();
  15. AfterProceed();
  16. }
  17. /// <summary>
  18. /// 业务逻辑之前
  19. /// </summary>
  20. /// <param name="user"></param>
  21. private void BeforeProceed()
  22. {
  23. Console.WriteLine("方法执行前");
  24. }
  25. /// <summary>
  26. /// 业务逻辑之后
  27. /// </summary>
  28. /// <param name="user"></param>
  29. private void AfterProceed()
  30. {
  31. Console.WriteLine("方法执行后");
  32. }
  33. }
  34. public interface IBusiness
  35. {
  36. void DoSomething();
  37. }
  38. //前端调用
  39. new ProxyBusinessAOP().DoSomething();

C 使用.Net Remoting/RealProxy 实现动态代理-局限在业务类必须是继承自MarshalByRefObject类型

  1. /// <summary>
  2. /// 必须继承自MarshalByRefObject父类,否则无法生成
  3. /// </summary>
  4. public class Business : MarshalByRefObject, IBusiness
  5. {
  6. public void DoSomething()
  7. {
  8. Console.WriteLine("DoSomething");
  9. }
  10. }
  11. /// <summary>
  12. /// 真实代理
  13. /// </summary>
  14. /// <typeparam name="T"></typeparam>
  15. public class MyRealProxy<T> : RealProxy
  16. {
  17. private T tTarget;
  18. public MyRealProxy(T target)
  19. : base(typeof(T))
  20. {
  21. this.tTarget = target;
  22. }
  23.  
  24. public override IMessage Invoke(IMessage msg)
  25. {
  26. BeforeProceede(msg);//Log try-catch
  27.  
  28. IMethodCallMessage callMessage = (IMethodCallMessage)msg;
  29. object returnValue = callMessage.MethodBase.Invoke(this.tTarget, callMessage.Args);
  30.  
  31. AfterProceede(msg);
  32.  
  33. return new ReturnMessage(returnValue, new object[], , null, callMessage);
  34. }
  35. public void BeforeProceede(IMessage msg)
  36. {
  37. Console.WriteLine("方法执行前可以加入的逻辑");
  38. }
  39. public void AfterProceede(IMessage msg)
  40. {
  41. Console.WriteLine("方法执行后可以加入的逻辑");
  42. }
  43. }
  44. /// <summary>
  45. /// 透明代理
  46. /// </summary>
  47. public static class TransparentProxy
  48. {
  49. public static T Create<T>()
  50. {
  51. T instance = Activator.CreateInstance<T>();
  52. MyRealProxy<T> realProxy = new MyRealProxy<T>(instance);
  53. T transparentProxy = (T)realProxy.GetTransparentProxy();
  54. return transparentProxy;
  55. }
  56. }
  57.  
  58. public interface IBusiness
  59. {
  60. void DoSomething();
  61. }
  62. //前端调用
  63. IBusiness iBusiness = new Business();
  64. iBusiness.DoSomething();
  65. Console.WriteLine("*********************");
  66. iBusiness = TransparentProxy.Create<Business>();
  67. iBusiness.DoSomething();

D 使用Castle\DynamicProxy 实现动态代理-方法必须是虚方法

  1. /// <summary>
  2. /// 使用Castle\DynamicProxy 实现动态代理
  3. /// 方法必须是虚方法
  4. /// </summary>
  5. public class CastleProxyAOP
  6. {
  7. public static void Show()
  8. {
  9.  
  10. ProxyGenerator generator = new ProxyGenerator();
  11. MyInterceptor interceptor = new MyInterceptor();
  12. Business bus = generator.CreateClassProxy<Business>(interceptor);
  13. bus.DoSomething();
  14. Console.Read();
  15. }
  16. public interface IBusiness
  17. {
  18. void DoSomething();
  19. }
  20.  
  21. public class Business : IBusiness
  22. {
  23. /// <summary>
  24. /// 必须带上virtual 否则无效~
  25. /// </summary>
  26. /// <param name="user"></param>
  27. public virtual void DoSomething()
  28. {
  29. Console.WriteLine("DoSomething");
  30. }
  31. }
  32.  
  33. public class MyInterceptor : IInterceptor
  34. {
  35. public void Intercept(IInvocation invocation)
  36. {
  37. PreProceed(invocation);
  38. invocation.Proceed();//就是调用原始业务方法
  39. PostProceed(invocation);
  40. }
  41. public void PreProceed(IInvocation invocation)
  42. {
  43. Console.WriteLine("方法执行前");
  44. }
  45.  
  46. public void PostProceed(IInvocation invocation)
  47. {
  48. Console.WriteLine("方法执行后");
  49. }
  50. }
  51. }

C# 面向切面编程 AOP的更多相关文章

  1. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  2. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  3. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  4. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  5. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  6. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  7. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  8. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  9. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  10. 面向切面编程AOP

    本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...

随机推荐

  1. 细说JVM内存模型

    细说JVM内存模型 前言 在正式学习 JVM 内存模型之前,先注意以下几个是问题: JVM 内存模型与 JAVA 内存模型不是同一个概念.JVM 内存模型是从运行时数据区的结构的角度描述的概念:而 J ...

  2. Linux海量数据高并发实时同步架构方案杂谈

    不论是Redhat还是CentOS系统,除去从CDN缓存或者数据库优化.动静分离等方面来说,在架构层面上,实 现海量数据高并发实时同步访问概括起来大概可以从以下几个方面去入手,当然NFS的存储也可以是 ...

  3. 【10分钟学Spring】:@Profile、@Conditional实现条件化装配

    根据不同的环境来装配不同的bean 企业级开发中,我们一般有多种环境,比如开发环境.测试环境.UAT环境和生产环境.而系统中有些配置是和环境强相关的,比如数据库相关的配置,与其他外部系统的集成等. 如 ...

  4. 程序员常用markdown语法记忆小结

    0.toc被中括号包围,实现自动提取标题生成目录 [TOC]   1.*的用法 * 一星:黑点 *二星:斜体* 三星:分割线 * * * **四星:粗体**   2.#的用法 # 1级标题 ## 2j ...

  5. iOS 基本控件的使用以及系统层次架构(1)

    User  Interface iOS系统架构层次图 -CocoaTouch UI相关 -媒体层(Media) 音频.视频.图形.动画 -核心服务层(Core services) 内存.网络.文件.线 ...

  6. 胸部CT提取分割肺部

    1. 肺部分割提取简介 在处理胸部CT时,我们常常需要获取肺部的一个mask,也就是将肺部结构从数据中提取出来.二维图像还好说,但是三维图像就会变得复杂复杂一点.肺部的分割常常做后续操作的预处理,所以 ...

  7. [TimLinux] Python3 Coverity zeep/SOAP 库使用示例

    废话不多说,上代码: # 基于Coverity的示例 from zeep import Client from zeep.wsse.username import UsernameToken conf ...

  8. Java中的try-catch-finally异常处理

    Java中的try-catch-finally异常处理 一.异常处理 异常(Exception):是在运行发生的不正常情况. 原始异常处理: if(条件) { 处理办法1 处理办法2 处理办法3 } ...

  9. UVA-11995

    There is a bag-like data structure, supporting two operations:1 x Throw an element x into the bag.2 ...

  10. ARTS-S mac终端ftp命令行上传下载文件

    上传 ftp -u ftp://root:123456@10.11.12.3/a.txt a.txt 下载 ftp -o a.txt ftp://root:123456@10.11.12.13/a.t ...