因最近工作需要一个动态的权限配置功能,具体实现逻辑是c#的动态代理功能,废话不多说,直接干货。
需求:

  1. 用户分为管理员、普通用户
  2. 不同用户拥有不同功能权限
  3. 用户的权限可配置
  4. 新增功能时,不用修改权限配置功能

从本篇开始我们使用动态代理完成一个案例,包含动态权限控制的核心功能。

  • 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, , methodCall.LogicalCallContext, methodCall);
} }

运行结果

好了,我们可以看到代理方法已经生效了,这也是最最核心的功能。

源码网盘地址

注:虽然图片来自csdn,但依然是本人在csdn的原创

c#, AOP动态代理实现动态权限控制(一)的更多相关文章

  1. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  2. Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制

    kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 第三章 Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制 Ka ...

  3. spring——AOP(静态代理、动态代理、AOP)

    一.代理模式 代理模式的分类: 静态代理 动态代理 从租房子开始讲起:中介与房东有同一的目标在于租房 1.静态代理 静态代理角色分析: 抽象角色:一般使用接口或者抽象类来实现(这里为租房接口) pub ...

  4. AOP面向切面编程JAVA动态代理实现用户权限管理(实现篇)

    java动态代理机制的功能十分强大,使用动态代理技术能够有效的降低应用中各个对象之间的耦合紧密程度,提高开发的效率以及程序的可维护性,事实上Spring AOP就是建立在Java动态代理的基础之上.其 ...

  5. AOP底层实现原理,动态代理如何动态

    代理 指定另外一个主体代替原来的某个主体去执行某个事物 代理执行的人 需要代理的人 需要代理的事情是一定要做的 但是被代理的人没有时间或自己做的不专业 静态代理: 父母朋友帮忙物色找对象 代理人掌握需 ...

  6. 动态代理 JDK动态代理 CGLIB代理

    代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法.实际执行的是被代理类的方法. 而AOP,是通过动态代理实现的. 一.简单来说: JD ...

  7. java 静态代理 JDK动态代理 Cglib动态代理

    下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...

  8. java 动态代理 和动态编程

    概述 代理分两种技术,一种是jdk代理(机制就是反射,只对接口操作),一种就是字节码操作技术.前者不能算技术,后者算是新的技术.未来将有大的动作或者较为广泛的应用和变革,它可以实现代码自我的编码(人工 ...

  9. Java的三种代理模式:静态代理/JDK动态代理/Cglib动态代理

    1.静态代理:需要定义接口或者父类,目标对象与代理对象均实现同一接口或继承同一父类. 2.JDK动态代理:需要目标对象实现一个接口,通过动态反射的机制,生成代理对象,实现同一个接口 3.Cglib动态 ...

随机推荐

  1. Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介

    前言 之前的系列博客,陆续学习整理了自动化测试环境的搭建.IE和Chrome浏览器驱动的配置.selenium-webdriver模块封装的元素定位以及控制浏览器.处理警示框.鼠标键盘等方法的使用,这 ...

  2. 第6章 演示服务器和测试 - Identity Server 4 中文文档(v1.0.0)

    您可以使用您喜欢的客户端库尝试IdentityServer4.我们在demo.identityserver.io上有一个测试实例.在主页面上,您可以找到有关如何配置客户端以及如何调用API的说明. 此 ...

  3. Eureka相关知识点

    本文讲述的是 Eureka server, 服务提供者.消费者的一些概念和配置说明. Eureka Server 服务注册中心 Eureka的高可用设计 Eureka侧重点是AP,高可用;Eureka ...

  4. CSS代码片段

    定位: 将元素居中 将元素水平居中 将元素垂直居中 样式: 文字毛玻璃效果 -------------------------------------------代码----------------- ...

  5. Python_实现json数据的jsonPath(精简版)定位及增删改操作

    基于python实现json数据的jsonPath(精简版)定位及增删改操作   by:授客 QQ:1033553122 实践环境 win7 64 Python 3.4.0 代码 #-*- encod ...

  6. 五、RemoteViews

    RemoteViews表示的是一个View结构,它可以在其他进程中显示.RemoteViews在Android中的使用场景有两种:通知栏和桌面小部件. 1.RemoteViews的应用 RemoteV ...

  7. textarea 输入长度限制

    <textarea " placeholder="请输入详细地址(100字以内)"></textarea>

  8. 算法: 整数中1出现的次数(从1到n整数中1出现的次数)

    问题: 整数中1出现的次数(从1到n整数中1出现的次数) 问题:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1.10.11 ...

  9. spring学习总结——装配Bean学习三(xml装配bean)

    通过XML装配bean Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了.不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用 ...

  10. HDFS副本放置策略

    1.第一个副本放置在上传文件的DataNode上,如果是集群外提交,则随机挑选一个磁盘不太满,CPU不太忙的节点. 2.第二个副本放置在与第一个副本不同的机架上. 3.第三个副本放置在与第二个副本同机 ...