zoukankan      html  css  js  c++  java
  • .NET Core 实现动态代理 AOP

    AOP实现

    class DynamicProxy<T> : DispatchProxy
    {
        public T? decorated { get; set; }//目标类  
        public Action<object?[]?>? _beforeAction { get; set; }  // 动作之后执行  
        public Action<object?[]?, object>? _afterAction { get; set; } // 动作之前执行
    
        protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
        {
            Exception exception = null;
    
            BeforeAction(args);
            object result = null;
            try
            {
                //调用实际目标对象的方法  
                result = targetMethod?.Invoke(decorated, args);
            }
            catch (Exception ex)
            {
                exception = ex;
            }
            AfterAction(args, result);
            //调用完执行方法后的委托,如果有异常,抛出异常  
            if (exception != null)
            {
                throw exception;
            }
            return result;
        }
    
        /// <summary>  
        /// 创建代理实例  
        /// </summary>  
        /// <param name="decorated">代理的接口类型</param>  
        /// <param name="beforeAction">方法执行前执行的事件</param>  
        /// <param name="afterAction">方法执行后执行的事件</param>  
        /// <returns></returns>  
        public T Create(T decorated, Action<object?[]?> beforeAction, Action<object?[]?, object> afterAction)
        {
            object proxy = Create<T, DynamicProxy<T>>(); // 调用DispatchProxy 的Create  创建一个新的T  
            DynamicProxy<T> proxyDecorator = (DynamicProxy<T>)proxy;
            proxyDecorator.decorated = decorated;
            //把自定义的方法委托给代理类  
            proxyDecorator._beforeAction = beforeAction;
            proxyDecorator._afterAction = afterAction;
            return (T)proxy;
        }
    
    
        private void BeforeAction(object?[]? args)
        {
            try
            {
                _beforeAction.Invoke(args);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"执行之前异常:{ex.Message},{ex.StackTrace}");
            }
        }
    
        private void AfterAction(object?[]? args, object? result)
        {
            try
            {
                _afterAction.Invoke(args, result);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"执行之后异常:{ex.Message},{ex.StackTrace}");
            }
        }
    }
    
    interface IInterceptor
    {
        /// <summary>  
        /// 执行之前  
        /// </summary>  
        /// <param name="args">参数</param>  
        void BeforeAction(object?[]? args);
    
        /// <summary>  
        /// 执行之后  
        /// </summary>  
        /// <param name="args">参数</param>  
        /// <param name="result">结果</param>  
        void AfterAction(object?[]? args, object result);
    }
    
    [AttributeUsage(AttributeTargets.Class)]
    class InterceptAttribute : Attribute
    {
        public Type Type { get; set; }
        public InterceptAttribute(Type type)
        {
            this.Type = type;
        }
    }
    
    class ProxyFactory
    {
        /// <summary>  
        /// 创建代理实例  
        /// </summary>  
        /// <param name="decorated">代理的接口类型</param>  
        /// <returns></returns>  
        public static T Create<T>()
        {
            T decorated = ServiceHelper.GetService<T>();
            Type type = decorated.GetType();
            InterceptAttribute attrib = type.GetCustomAttribute<InterceptAttribute>();
            IInterceptor interceptor = ServiceHelper.GetService<IInterceptor>(attrib.Type);
    
            //创建代理类  
            return new DynamicProxy<T>().Create(decorated, interceptor.BeforeAction, interceptor.AfterAction);
        }
    }
    
    static class ServiceHelper
    {
        public static IServiceProvider? serviceProvider { get; set; }
    
        public static void BuildServiceProvider(IServiceCollection serviceCollection)
        {
            //构建容器  
            serviceProvider = serviceCollection.BuildServiceProvider();
        }
    
        public static T GetService<T>(Type serviceType)
        {
            return (T)serviceProvider.GetService(serviceType);
        }
    
        public static T GetService<T>()
        {
            return serviceProvider.GetService<T>();
        }
    }
    

    AOP使用

    class AOPTest : IInterceptor
    {
        void IInterceptor.BeforeAction(object[] args)
        {
            Console.WriteLine($"AOP方法执行之前,args:{args}");
            //throw new Exception("异常测试(异常,但依然不能影响程序执行)");
        }
         void IInterceptor.AfterAction(object[] args, object result)
        {
            Console.WriteLine($"AOP方法执行之后,args:{args},result:{result}");
        }
    }
    
    interface ITestService
    {
        public int Add(int a, int b);
    }
    
    [Intercept(typeof(AOPTest))]
    class TestService : ITestService
    {
        int ITestService.Add(int a, int b)
        {
            Console.WriteLine($"正在执行--》Add({a},{b})");
    
            //throw new Exception("方法执行--》测试异常");
            return a + b;
        }
    }
    

    测试

        IServiceCollection = new ServiceCollection();
        serviceCollection.AddTransient(typeof(AOPTest));
        serviceCollection.AddTransient<ITestService, TestService>();
        //构建容器  
        ServiceHelper.BuildServiceProvider(serviceCollection);
    
        //用工厂获取代理实例  
        var s = ProxyFactory.Create<ITestService>();
        var sum = s.Add(1, 2);
        Console.WriteLine("执行完毕=====>" + sum);
    

    测试输出

    AOP方法执行之前,args:System.Object[]
    正在执行--》Add(1,2)
    AOP方法执行之后,args:System.Object[],result:3
    执行完毕=====>3
    

    转自:极客Bob
    链接:cnblogs.com/Bob-luo/p/15716592.html

    --------------------------- 知道的更多,不知道的也更多 ---------------------------
  • 相关阅读:
    HDU1864--01背包
    HDU4508--完全背包
    HDU5410--01背包+完全背包
    HDU1284--完全背包
    HDU1248--完全背包
    HDU2191--多重背包(二进制分解+01背包)
    HDU2186--水
    PAT乙级--1003
    51Nod--1006 lcs
    51Nod--1008
  • 原文地址:https://www.cnblogs.com/mryux/p/15770553.html
Copyright © 2011-2022 走看看