首页 > 编程语言 >C# AOP实现方式

C# AOP实现方式

时间:2023-02-22 23:45:31浏览次数:43  
标签:功能 Code 方式 C# Unity AOP cs View

一、AOP概念

    官方解释:AOP(Aspect-Oriented Programming,面向切面编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方法论,是对传统OOP编程的一种补充。OOP是关注将需求功能划分为不同的并且相对独立、封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系;AOP是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。AOP是使用切面(aspect)将横切关注点模块化,OOP是使用类将状态和行为模块化。在OOP的世界中,程序都是通过类和接口组织的,使用它们实现程序的核心业务逻辑是十分合适,但是对于实现横切关注点(跨越应用程序多个模块的功能需求)则十分吃力,比如日志记录、权限验证、异常拦截等。

    个人理解:AOP就是将公用功能提取出来,如果以后公用功能的需求发生变化,只需要改动公用模块的代码即可,多个调用的地方则不需要改动。所谓面向切面,就是只关注通用功能,而不关注业务逻辑。它实现的方式一般是通过拦截,比如,项目中一般都有权限验证的功能,进入每个页面前都会验证当前登录用户是否有权限查看该界面。我们不可能说在每个页面的初始化方法里面都去写这段验证的代码,这个时候我们的AOP就派上用场了。AOP的机制是预先定义一组特性,使它具有拦截方法的功能,可以让你在执行方法之前和之后做你想做的业务,而我们使用的时候只需要在对应的方法或者类定义上面加上某一个特性就好了。

    二、AOP优势

    1)将通用功能从业务逻辑中抽离出来,可以省略大量的重复代码,有利于代码的操作和维护。

    2)在软件设计时,抽出通用功能(切面),有利于软件设计的模块化,降低软件架构的复杂度。也就是说通用的功能都是一个个单独的模块,在项目的主业务里面是看不到这些通用功能的设计代码的。

    三、AOP应用

    3.1、静态代理方式

    3.1.1、使用装饰器模式实现静态代理

    1)新建一个类:DecoratorAOP.cs

  View Code

    2)调用:

  View Code

    3)运行结果如下:

    上面代码是模拟用户注册的例子:注册信息提交前,需要做一些准备工作,比如数据有效性校验等;注册信息提交后,还需要做日志记录等。从上面的代码可以看出,我们通过静态植入的方式,手动地在执行方法前和执行方法后让它做一些我们需要的功能。

    3.1.2、使用代理模式实现静态代理

    1)新建一个类:ProxyAOP.cs

  View Code

    2)调用:

  View Code

    3)运行结果如下:

    3.2、动态代理方式

    3.2.1、使用.Net Remoting/RealProxy实现动态代理

    1)新建一个类:RealProxyAOP.cs

  View Code

    2)调用:

  View Code

    3)运行结果如下:

    3.2.2、使用Castle\DynamicProxy实现动态代理

    1)在NuGet中安装Castle.Core。

    2)新建一个类:CastleProxyAOP.cs

  View Code

    3)调用:

  View Code

    4)运行结果如下:

    3.2.3、使用EntLib\PIAB Unity实现AOP(非配置)

    1)在NuGet中安装Unity及Unity.Interception。

    2)新建一个类:UnityAOP.cs

  View Code

    3)调用:

  View Code

    4)运行结果如下:

    3.2.4、使用EntLib\PIAB Unity实现AOP(带配置)

    1)继续在NuGet中安装Unity.Configuration、Unity.Interception.Configuration及Newtonsoft.Json。

    2)分别建立以下类:

  Entity.cs(用户实体类)   IUserProcessor.cs(用户注册接口)   UserProcessor.cs(用户注册接口实现类)   UnityConfigAOP.cs(运行测试)   ExceptionBehavior.cs(异常处理类)   CachingBehavior.cs(缓存处理类)   PermissionBehavior.cs(权限处理类)   ParameterCheckBehavior.cs(参数检测类)   LogBehavior.cs(日志处理类)

    3)新建一个配置文件Unity.Config(本例代码是在UnityConfigAOP文件夹下),在其属性的复制到输出目录项下选择始终复制。

  Unity.Config

    4)调用:

  View Code

    5)运行结果如下:

    3.3、IL编织方式

    IL编织方式,可以使用PostSharp框架来做,但是由于Postsharp从2.0版本开始收费,此处不再作说明,有兴趣的话可以百度一下。 

 

    参考自:

    https://www.cnblogs.com/landeanfen/p/4782370.html

    https://www.cnblogs.com/artech/archive/2011/12/01/autointerception.html

    E神公开课代码

 

转载自:https://blog.csdn.net/buzul/article/details/115588004

标签:功能,Code,方式,C#,Unity,AOP,cs,View
From: https://www.cnblogs.com/cnhk19/p/17146430.html

相关文章

  • 【论文阅读】IROS2022: Dynamics-Aware Spatiotemporal Occupancy Prediction in Urba
    0.参考与前言完整题目:Dynamics-AwareSpatiotemporalOccupancyPredictioninUrbanEnvironments论文链接:https://arxiv.org/abs/2209.13172代码链接:无缩写:occupanc......
  • React高阶组件
    一、什么是高阶组件(Higher-OrderComponents)?高阶函数:至少满足以下条件之一:接受一个或多个函数作为输入;输出一个函数;高价组件官方定义:高阶组件是参数为组件,返回值......
  • Monitoring Performance Using WMI
    LearnPreviousVersionsWindowsScriptingScriptingClinic How'sMyDriving?MonitoringPerformanceUsingWMIArticle06/30/200631minutestoread......
  • C#后缀表达式解析计算字符串公式
    当我们拿到一个字符串比如:20+31*(100+1)的时候用口算就能算出结果为3151,因为这是中缀表达式对于人类的思维很简单,但是对于计算机就比较复杂了。相对的后缀表达式适合计算机......
  • LZ4 - Extremely fast compression
      zephyrproject-rtos/lz4:ExtremelyFastCompressionalgorithm(github.com) LZ4-ExtremelyfastcompressionLZ4islosslesscompressionalgorithm,prov......
  • docker 本地linux环境调试 .net 代码 —— debugging dockerized .NET core applicat
    原文:HowtoDebugDockerized.NETCoreAppsinVSCode(freecodecamp.org) vscoderundockercommand:dockerimagebuild--pull--file"C:\[path]/[projectN......
  • 【LeetCode二叉树#04】判断对称二叉树
    对称二叉树力扣题目链接(opensnewwindow)给定一个二叉树,检查它是否是镜像对称的。思路本题中,不能单纯去比较左右子节点的是否对称(都有值且不为空)因为如果按上面那......
  • 华为认证欧拉openEuler-HCIA文本编辑器及文本处理
    文本编辑器及文本处理文本编辑器介绍常见的Linux文本编辑器有:emacsnanogeditkeditvivimLinux文本编辑器-emacsemacs是一款功能强大的编辑器,与其说是一款编辑器,它更像......
  • react中类组件的写法
    核心:1.类组件必须要继承React.Component2.类组件中的render()方法,返回值是一个jsx//class组件import"./App.css";importReactfrom"react";//创建......
  • 红帽认证RedHat-RHCSA shell的基本应用
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操......