原创: eleven

原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg

【前言】

AOP(Aspect-Oriented Programming)面向切面编程思想作为OOP的补充,在.Net领域也流行好几年了,确实能解决OOP的顽疾,是OOP程序设计一大福音!现在各种框架组件里面,AOP已经是标配,各种笔试面试的过程中,更是不可或缺的!上一篇Eleven从理论上细谈了对AOP的理解,今天直接上C#实例!

【静态AOP】

 

AOP要做的就是能在不破坏封装的前提下,去扩展新的功能!说道这里,我们应该很容易想到设计模式里面的装饰器模式和代理模式,下面分别看看具体实现:

以上为原始业务,就是一个简单的抽象+实现,里面模拟完成用户的注册功能。

组合+继承的融合应用,是装饰器模式的显著特征。这里做到了通过Decorator来调用RegUser时,能在注册用户前后,分别加上额外的逻辑,可以是任何你需要的通用逻辑,同时也没有破坏原有封装!

代理模式同样简单,做到了通过Proxy来调用RegUser时,能在注册用户前后,分别加上额外的逻辑,可以是任何你需要的通用逻辑,同时也没有破坏原有封装!

注:有小伙伴儿会觉得两个模式是一样的,建议去历史消息查看代理模式和和装饰器模式的文章,有分别讲解两种模式和异同!

【动态AOP】

 

看完两种静态AOP实现后,小伙伴儿们可能有些疑问,如果扩展功能都是这样写死的话,好像也没啥意义呀,而且目前这两个也谈不上通用,只是为固定业务服务的。是的,那下面就来看集中动态的AOP实现方式,这才是真的AOP实现!

基于.Net Remoting的RealProxy实现的动态代理,有个局限是业务类必须继承自MarshalByRefObject类型。调用RegUser时,能在注册用户前后,分别加上额外的逻辑,可以是任何你需要的通用逻辑,同时也没有破坏原有封装!

基于Castle的DynamicProxy实现的动态代理,有个局限是业务类方法必须显示声明为virtual。调用RegUser时,能在注册用户前后,分别加上额外的逻辑,可以是任何你需要的通用逻辑,同时也没有破坏原有封装!

动态AOP还有种实现方式是静态织入,常见的框架有AspectSharp、PostSharp等。实现的核心原理是在程序运行之前的编译时或者编译后在IL的级别修改二进制程序集的方式来插入额外代码,来完成功能的织入!这种植入是直接修改了dll文件的,基于成熟的框架实现并不难(PostSharp收费),但是有个重大缺陷是dll替换升级问题,而且调试很不方便!这里Eleven就不打算展开了。

【结语】

本文展示了C#中AOP的四种实现方式,包含静态设计模式实现和动态代理实现,同时还探讨了静态织入技术的原理和局限性。不过以上多种方式都有自己的局限性,在实际开发过程中并不太方便,下一篇文章里,我将带来实际开发项目中,AOP的实践,敬请期待!欢迎关注公众号,欢迎讨论,欢迎转发,愿天下有需求的人都能看到!

更多技术问题,欢迎关注公众号【程序员在职场】进行获取

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

  1. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  2. Aspects– iOS的AOP面向切面编程的库

    简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原 ...

  3. 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~

    简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...

  4. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  5. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  6. Javascript aop(面向切面编程)之around(环绕)

    Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...

  7. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  8. [转] AOP面向切面编程

    AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  9. C# AOP 面向切面编程之 调用拦截

    有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...

随机推荐

  1. XSS过滤JAVA过滤器filter 防止常见SQL注入

    Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...

  2. Redis详解(二)------ redis的配置文件介绍

    上一篇博客我们介绍了如何安装Redis,在Redis的解压目录下有个很重要的配置文件 redis.conf (/opt/redis-4.0.9目录下),关于Redis的很多功能的配置都在此文件中完成的 ...

  3. java基础(六)-----String性质深入解析

    本文将讲解String的几个性质. 一.String的不可变性 对于初学者来说,很容易误认为String对象是可以改变的,特别是+链接时,对象似乎真的改变了.然而,String对象一经创建就不可以修改 ...

  4. 你可能不知道的jvm的类加载机制

    引言:在java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的. 加载:查找并加载类的二进制数据(class文件加载到内存中) 连接:a 验证:确保被加载类的正确性. b准备:为类的静态 ...

  5. 卷积神经网络之VGG

    2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络:VGGNet,并取得了ILSVRC2014比 ...

  6. 程序员如何让自己 Be Cloud Native - 配置篇

    前言 这是<程序员如何让自己 Be Cloud Native>系列文章的第二篇,从第一篇的反馈来看,有些同学反馈十二要素太形式主义,不建议盲目跟从.作者认为任何理论和技术都需要有自己的观点 ...

  7. 使用PixiJS做一个小游戏

    PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...

  8. 结合JDK源码看设计模式——观察者模式

    前言: 现在我们生活中已经离不开微信,QQ等交流软件,这对于我们来说不仅是交流,更有在朋友圈中或空间中进行分享自己的生活,同时也可以通过这个渠道知道别人的生活.我们在看朋友圈的时候其实我们扮演的就是一 ...

  9. Center a website:网页居中

    inside the <body> tags, using a "wrapper" div to control the whole section. HTML: &l ...

  10. PostgreSQL(PostGIS)安装和入门的若干问题

    1. 装完PostgreSQL后记得打开pgAdmin4启动一下服务器和启动一下数据库,否则PostGIS装不上. 2. pgAdmin4是网页,而3是客户端,当然都可以在File - Prefere ...