AOP面向切面编程C#实例
原创: 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#实例的更多相关文章
- Spring:AOP面向切面编程
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...
- Aspects– iOS的AOP面向切面编程的库
简介 一个简洁高效的用于使iOS支持AOP面向切面编程的库.它可以帮助你在不改变一个类或类实例的代码的前提下,有效更改类的行为.比iOS传统的 AOP方法,更加简单高效.支持在方法执行的前/后或替代原 ...
- 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- Javascript aop(面向切面编程)之around(环绕)
Aop又叫面向切面编程,其中“通知”是切面的具体实现,分为before(前置通知).after(后置通知).around(环绕通知),用过spring的同学肯定对它非常熟悉,而在js中,AOP是一个被 ...
- Method Swizzling和AOP(面向切面编程)实践
Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...
- [转] AOP面向切面编程
AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- C# AOP 面向切面编程之 调用拦截
有时候我们需要在代码中对方法调用进行拦截,并修改参数和返回值,这种操作叫做AOP(面向切面编程) 不过需要注意的是,AOP的效率很慢,在需要高效率场合慎用. 以下是C#的AOP方法: 首先建立一个控制 ...
随机推荐
- 虚拟机console基础环境配置——sshd安全登陆
1. 概述2. 配置console的登陆2.1 配置sshd服务2.2 重启sshd服务2.3 无法登陆的问题解决3. 配置密钥登陆3.1 上传公钥的方式3.2 下载密码的方式3.3 虚拟机和宿主机共 ...
- IP地址、端口、TCP协议、UDP协议
最近在看<疯狂java讲义>,第17章网络编程里提到IP地址.端口.TCP协议.UDP协议这几个概念.以前上课时学过,现在重温了一遍.在这里,用自己的语言简单的讲解一下吧. IP地址:每一 ...
- Linux上删除大量文件几种方式对比
目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...
- elasticsearch6.6.2在Centos6.9的安装
JDK8 做个记录,以防以后忘记能够查看. 1.elastic是java编写的,先搭建运行环境,6.6.2版本必须要jdk8以上版本才可运行,先官网下载jdk,上传服务器 https://www.or ...
- asp.net core系列 54 IS4用客户端凭据保护API
一. 概述 本篇开始进入IS4实战学习,从第一个示例开始,该示例是 “使用客户端凭据保护API”,这是使用IdentityServer保护api的最基本场景.该示例涉及到三个项目包括:Identity ...
- Mybatis增删改查,Demo整合
第一步:MyBatis的Jar包引入mybatis-3.2.7.jarmysql-connector-java-5.1.8.jar MyBatis的pom.xml依赖 <dependencies ...
- 从零开始学TensorFlow
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在学习TensorFlow的相关知识,了解了Te ...
- 第2章 授权端点(Authorize Endpoint) - IdentityModel 中文文档(v1.0.0)
对于大多数情况,OAuth 2.0和OpenID Connect授权端点的GET请求需要具有许多查询字符串参数. 虽然您可以使用任何方法创建带参数的URL来创建正确的字符串,但RequestUrl类是 ...
- PHP 单例模式优点意义及如何实现
一.什么是单例模式? 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2. ...
- 为什么腾讯有QQ,还要推出微信?
在微信刚出现时候,很多人奇怪,为什么腾讯有QQ,还要推出微信? 一开始,我也认为它与QQ没有什么区别.有这种看法,是因为绝大多数时候,我都仅仅只使用即时聊天功能,微信上有的语音.视频.文字等等,这些在 ...