原创: 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. JQuery 将div中的内容替换掉

    $("#div2").children().replaceWith($("#userText").val());谷歌没有效果. $("#div2&qu ...

  2. Linux 系统目录结构说明

    在刚开始接触Linux系统时,对其目录结构迷茫的很,尤其是很少使用或者刚开始接触Linux系统的同学:我也是最近项目需要开始上手,所以查看了些资料,特整理出来供大家互相学习: 1.目录结构总揽 以下是 ...

  3. sau交流学习社区--在element-ui中新建FormData对象组合上传图片和文件的文件对象,同时需要携带其他参数

    今天有一个坑,同时要上传图片和文件,而且图片要展示缩略图,文件要展示列表. 我的思路是: 首先,只上传附件照片,这个直接看ele的官方例子就行,不仅仅上传附件照片,还同时上传其他参数. 然后,再做上传 ...

  4. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  5. 一起来学spring Cloud | 第一章:spring Cloud 与Spring Boot

    目前大家都在说微服务,其实微服务不是一个名字,是一个架构的概念,大家现在使用的基于RPC框架(dubbo.thrift等)架构其实也能算作一种微服务架构. 目前越来越多的公司开始使用微服务架构,所以在 ...

  6. vue之$root,$parent

    $root vue状态管理使用vuex,如果项目不大,逻辑不多,name我们没必要用vuex给项目增加难度,只需要用$root设置vue实例的data就行了,如下 main.js new Vue({ ...

  7. 你可能不知道的 docker 命令的奇淫怪巧

    你可能不知道的 docker 命令的奇淫怪巧 Intro 介绍并收录一些可能会用到的一些简单实用却很少有人用的 docker 命令 dangling images build 自己的 docker 镜 ...

  8. DataPipeline丨新型企业数据融合平台的探索与实践

    文 |刘瀚林 DataPipeline后端研发负责人 交流微信 | datapipeline2018 一.关于数据融合和企业数据融合平台 数据融合是把不同来源.格式.特点性质的数据在逻辑上或物理上有机 ...

  9. goldengate同源一目标+多表和同源多目标+多表

    小结一下,永记心中!几经修改,看见完美曾经遇到的问题或值得注意的地方,就此记录一下,以免再犯开始...******************同源一目标+多表******************针对部分表 ...

  10. Certbot为域名申请免费SSL证书

    Certbot(Let's Encrypt)是一个非盈利性认证机构通过运行互联网安全研究小组(ISRG)提供X.509 证书的传输层安全性不收取任何费用(TLS)加密.证书有效期为90天,在此期间可以 ...