原创: 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. Android性能优化-内存泄漏的8个Case

    1为什么要做性能优化? 手机性能越来越好,不用纠结这些细微的性能? Android每一个应用都是运行的独立的Dalivk虚拟机,根据不同的手机分配的可用内存可能只有(32M.64M等),所谓的4GB. ...

  2. numpy C语言源代码调试(三)

    鉴于ddd过于简陋,希望找一个新一些的调试工具,看到有很多人推荐gdbgui,这是一个非常新的调试工具,前端使用浏览器,现在采用这一架构的软件越来越多,可以完全不必依赖庞大的gui类库,安装使用比较方 ...

  3. 腾讯云发布runC容器逃逸漏洞修复公告

    尊敬的腾讯云客户,您好:  近日,腾讯云安全中心监测发现轻量级容器运行环境runc被爆存在容器逃逸漏洞,攻击者可以在利用该漏洞覆盖Host上的runc文件,从而在Host上以root权限执行代码. 为 ...

  4. slice是什么时候决定要扩张?

    slice是什么时候决定要扩张? 网上说slice的文章已经很多了,大都已经把slice的内存扩张原理都说清楚了.但是是如何判断slice是否需要扩张这个点却没有说的很清楚.想当然的我会觉得这个app ...

  5. [区块链] 密码学——Merkle 树

    在计算机领域,Merkle树大多用来进行完整性验证处理.在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时,Merkle树会大大减少数据的传输量以及计算的复杂度. Merkle哈希树是 ...

  6. http/2.0时代已经来临了!

    知识分享  文章转自:https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/78906348 现在是资源共享的时代,同样也是知识分享的时代,如 ...

  7. 【Python3爬虫】常见反爬虫措施及解决办法(二)

    这一篇博客,还是接着说那些常见的反爬虫措施以及我们的解决办法.同样的,如果对你有帮助的话,麻烦点一下推荐啦. 一.防盗链 这次我遇到的防盗链,除了前面说的Referer防盗链,还有Cookie防盗链和 ...

  8. .NETCore 下支持分表分库、读写分离的通用 Repository

    首先声明这篇文章不是标题党,我说的这个类库是 FreeSql.Repository,它作为扩展库现实了通用仓储层功能,接口规范参考 abp vnext 定义,实现了基础的仓储层(CURD). 安装 d ...

  9. 我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序

    大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用. 大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭 ...

  10. vue中路由按需加载的几种方式

    使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如: import Hello from '@/components/Hello' import ...