因最近工作需要一個動態的許可權配置功能,具體實現邏輯是c#的動態代理功能,廢話不多說,直接乾貨。需求: 從本篇開始我們使用動態代理完成一個案例,包含動態許可權控制的核心功能。 c# 如何實現動態代理 c#實現動態代理可以使用.net framework 中提供的RealProxy類。 可以看到RealP ...
因最近工作需要一個動態的許可權配置功能,具體實現邏輯是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); } }
運行結果
好了,我們可以看到代理方法已經生效了,這也是最最核心的功能。
註:雖然圖片來自csdn,但依然是本人在csdn的原創