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的原創


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM