C# 动态代理

.net core的实现方法:

    /// <summary>
    /// 利用.NetRemoting动态代理
    /// .NET Core用DispatchProxy实现
    /// 通过动态代理,完成通用功能的扩展
    /// </summary>
    public class DynamicProxy
    {
        public static void Show()
        {
            UserInfo userInfo = new UserInfo()
            {
                Account = "Admin",
                Name = "李白",
                Password = "888888"
            };
            {
                IDBHelper dBHelper = new MySQLDBHelper();
                dBHelper.Save(userInfo);
            }
            {
                IDBHelper dbHelper = new MySQLDBHelper();
                dbHelper = TransparentProxy.Create<IDBHelper>(dbHelper);
                dbHelper.Save(userInfo);
            }
        }
    }

    /// <summary>
    /// 真实代理
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class MyRealProxy<T> : DispatchProxy
    {
        public T _Instance = default(T);

        //不同的类 不同的方法  增加不同的扩展----类/方法 上面加特性,这里检测特性
        protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
        {

            //System.Reflection.Emit

            //IP检测---HttpContext---权限检测  
            BeforeProceede(targetMethod);//Log  try-catch

            Console.WriteLine($"This is {targetMethod?.Name}-Invoked");

            if (args != null & args.Length > 0)
                Console.WriteLine($"参数信息:{JsonConvert.SerializeObject(args)}");

            var result = targetMethod?.Invoke(this._Instance, args);
            Console.WriteLine("方法自身被调用");

            //日志---性能统计---缓存一下--事务/异常处理
            AfterProceede(targetMethod);

            return result;
        }

        public void BeforeProceede(MethodInfo? targetMethod)
        {
            Console.WriteLine("方法执行前可以加入的逻辑");
        }
        public void AfterProceede(MethodInfo? targetMethod)
        {
            Console.WriteLine("方法执行后可以加入的逻辑");
        }
    }

    /// <summary>
    /// 透明代理
    /// </summary>
    public static class TransparentProxy
    {
        public static T Create<T>(T t)
        {
            dynamic tProxy = DispatchProxy.Create<T, MyRealProxy<T>>()!;
            tProxy!._Instance = t;

            return tProxy;
        }
    }

.net framework的实现方法:

    /// <summary>
    /// 利用 .NetRemoting动态代理
    /// 用RealProxy实现
    /// 通过动态代理,完成通用功能的扩展
    /// </summary>
    public class DynamicProxy
    {
        public static void Show()
        {
            UserInfo userInfo = new UserInfo()
            {
                Account = "Admin",
                Name = "李白",
                Password = "888888"
            };
            {
                IDBHelper dBHelper = new MysqlDBHelper();
                dBHelper.Save(userInfo);
            }
            {
                MysqlDBHelper dBHelper = TransparentProxy.Create<MysqlDBHelper>();
                dBHelper.Save(userInfo);
            }
        }
    }

    /// <summary>
    /// 真实代理
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class MyRealProxy<T> : RealProxy
    {
        private T tTarget;
        public MyRealProxy(T target)
            : base(typeof(T))
        {
            this.tTarget = target;
        }
        //不同的类 不同的方法  增加不同的扩展----类/方法 上面加特性,这里检测特性

        public override IMessage Invoke(IMessage msg)
        {
            BeforeProceede(msg);//Log  try-catch
            IMethodCallMessage callMessage = (IMethodCallMessage)msg;
            foreach (var item in callMessage.Args)
            {

            }
            var method = callMessage.MethodBase;
            //method.IsDefined(ty);

            //IP检测---HttpContext---权限检测
            object returnValue = callMessage.MethodBase.Invoke(this.tTarget, callMessage.Args);
            AfterProceede(msg);
            //日志---性能统计---缓存一下--事务/异常处理
            return new ReturnMessage(returnValue, new object[0], 0, null, callMessage);
        }
        public void BeforeProceede(IMessage msg)
        {
            Console.WriteLine("方法执行前可以加入的逻辑");
        }
        public void AfterProceede(IMessage msg)
        {
            Console.WriteLine("方法执行后可以加入的逻辑");
        }
    }

    /// <summary>
    /// 透明代理
    /// </summary>
    public static class TransparentProxy
    {
        public static T Create<T>()
        {
            T instance = Activator.CreateInstance<T>();
            MyRealProxy<T> realProxy = new MyRealProxy<T>(instance);
            T transparentProxy = (T)realProxy.GetTransparentProxy();
            return transparentProxy;
        }
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值