zoukankan      html  css  js  c++  java
  • c#, AOP动态代理实现动态权限控制(一)

    因最近工作需要一个动态的权限配置功能,具体实现逻辑是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, 0, methodCall.LogicalCallContext, methodCall);
            }
    
        }

    运行结果

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

    源码网盘地址

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

  • 相关阅读:
    Tableau Sheet
    Tableau Dashboard
    jQuery基础
    Tableau学习
    SQL小操作
    C#文件压缩成.Zip
    划水日记之大哥带我走渗透I
    各种推导式
    生成器表达式 (重点)
    生成器 生成器函数
  • 原文地址:https://www.cnblogs.com/abountme/p/10279177.html
Copyright © 2011-2022 走看看