欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c#, AOP动态代理实现动态权限控制(一)

程序员文章站 2022-08-31 12:44:42
因最近工作需要一个动态的权限配置功能,具体实现逻辑是c#的动态代理功能,废话不多说,直接干货。需求: 从本篇开始我们使用动态代理完成一个案例,包含动态权限控制的核心功能。 c# 如何实现动态代理 c#实现动态代理可以使用.net framework 中提供的RealProxy类。 可以看到RealP ......

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

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

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

c#, AOP动态代理实现动态权限控制(一)

c#, AOP动态代理实现动态权限控制(一)

  • c# 如何实现动态代理

c# framework 中提供的realproxy类。

c#, AOP动态代理实现动态权限控制(一)

可以看到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()方法来实现。

c#, AOP动态代理实现动态权限控制(一)

于是

     static void main(string[] args)
        {
            proxy proxy = new proxy(typeof(plane), new plane());
            plane plane = (plane)proxy.gettransparentproxy();
            plane.fly();
        }
 

接下来调试运行,代码执行到fly()方法,在invoke方法抛出异常,可以看出在msg参数中找到我们执行的方法信息与参数。代理模式的原理就是如此,通过代理类的代理方法去执行被代理类的方法。

c#, AOP动态代理实现动态权限控制(一)

 

 接下来我们利用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);
        }

    }

运行结果

c#, AOP动态代理实现动态权限控制(一)

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

源码网盘地址

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