当前位置:
首页 > Python基础教程 >
-
C#教程之c#, AOP动态代理实现动态权限控制(一)
因最近工作需要一个动态的权限配置功能,具体实现逻辑是c#的动态代理功能,废话不多说,直接干货。
需求:
- 用户分为管理员、普通用户
- 不同用户拥有不同功能权限
- 用户的权限可配置
- 新增功能时,不用修改权限配置功能
从本篇开始我们使用动态代理完成一个案例,包含动态权限控制的核心功能。
- c# 如何实现动态代理
c#实现动态代理可以使用.net framework 中提供的RealProxy类。
可以看到RealProxy是一个抽象类,其中Invoke是必须要重写的,我们尝试重写下RealProxy。
public class Proxy : RealProxy { public Proxy(Type t) : base(t) { } public override IMessage Invoke(IMessage msg) { throw new NotImplementedException(); } }
现在我们拥有自己的代理类了,我们需要一个“被代理”的对象,于是。
//被代理的类一定要继承自MarshalByRefObject public class Plane : MarshalByRefObject { public void Fly() { Console.WriteLine("fly"); } }
准备工作都做完了,究竟要如何实现代理,我们可以通过RealProxy的GetTransparntProxy()方法来实现。
于是
static void Main(string[] args) { Proxy proxy = new Proxy(typeof(Plane), new Plane()); Plane plane = (Plane)proxy.GetTransparentProxy(); plane.Fly(); }
接下来调试运行,代码执行到fly()方法,在invoke方法抛出异常,可以看出在msg参数中找到我们执行的方法信息与参数。代理模式的原理就是如此,通过代理类的代理方法去执行被代理类的方法。
接下来我们利用msg的参数信息去调用fly()方法。
public class Proxy : RealProxy { public Plane instance = null; public Proxy(Type t, Plane plane) : base(t) { this.instance = plane; } public override IMessage Invoke(IMessage msg) { Console.WriteLine("代理方法"); var methodCall = (IMethodCallMessage)msg; var result = methodCall.MethodBase.Invoke(instance, methodCall.Args); return new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall); } }
运行结果
好了,我们可以看到代理方法已经生效了,这也是最最核心的功能。
源码网盘地址
https://pan.baidu.com/s/1B02QBWkUDM1ldZEGVYbZsA
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式