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

转载于:https://www.cnblogs.com/abountme/p/10279177.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值