• 用Castle.Core实现方法拦截器


    1.去NuGet下载 Castle.Core.dll

    2.建一个普通的类。注意:本类2个方法,测试是否走拦截器。这里只有标记Virtual才能实现方法拦截。代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Castle
    {
       public class TestInterceptor
        { 
            public virtual void MethodInterceptor()
            { 
                Console.WriteLine("走过滤器");
            }
    
            public void NoInterceptor()
            {
                Console.WriteLine("没有走过滤器");
            } 
        }
    }
    View Code

    3.拦截器 重写拦截器方法:

    PreProcced,在进入拦截的方法之前调用。PerformProceed,在拦截的方法返回时调用。PostProcced,在拦截的方法运行完成后调用。 代码如下:

    using Castle.DynamicProxy;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Castle
    {
       public class Interceptor: StandardInterceptor
        {
            /// <summary>
            /// 调用前的拦截器
            /// </summary>
            /// <param name="invocation"></param>
            protected override void PreProceed(IInvocation invocation)
            {
                Console.WriteLine("调用前的拦截器,方法名是:{0}。", invocation.Method.Name);// 方法名   获取当前成员的名称。 
            }
            /// <summary>
            /// 拦截的方法返回时调用的拦截器
            /// </summary>
            /// <param name="invocation"></param>
            protected override void PerformProceed(IInvocation invocation)
            {
                Console.WriteLine("拦截的方法返回时调用的拦截器,方法名是:{0}。", invocation.Method.Name);
                base.PerformProceed(invocation); 
            }
    
            /// <summary>
            /// 调用后的拦截器
            /// </summary>
            /// <param name="invocation"></param>
            protected override void PostProceed(IInvocation invocation)
            {
                Console.WriteLine("调用后的拦截器,方法名是:{0}。", invocation.Method.Name); 
            }
        }
    }
    View Code

    4.调用

    using Castle.DynamicProxy;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Castle
    {
        class Program
        {
            static void Main(string[] args)
            {
                ProxyGenerator generator = new ProxyGenerator();//实例化【代理类生成器】  
                Interceptor interceptor = new Interceptor();//实例化【拦截器】  
    
                //使用【代理类生成器】创建Person对象,而不是使用new关键字来实例化  
                TestInterceptor test = generator.CreateClassProxy<TestInterceptor>(interceptor); 
                Console.WriteLine("当前类型:{0},父类型:{1}", test.GetType(), test.GetType().BaseType);
                Console.WriteLine();
                test.MethodInterceptor(); 
                Console.WriteLine();
                test.NoInterceptor();
                Console.WriteLine();  
                Console.ReadLine();
            }
        }
    }
    View Code

    5.输出结果:

  • 相关阅读:
    数据库 PSU,SPU(CPU),Bundle Patches 和 Patchsets 补丁号码快速参考 (文档 ID 1922396.1)
    从巡检备份失败排查解决数据库故障
    oracle rac自动生成awr
    解决 umount 时出现的 "Device is busy"
    修改sys密码与nbu备份脚本密码后,nbu备份报密码无效
    Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)
    oracle补丁升级
    AIX上增加逻辑卷时报错误0516-787 extendlv: Maximum allocation for logical volume
    oracle11g dataguard 完全手册
    数据库节点1存储丢失
  • 原文地址:https://www.cnblogs.com/liudehua0/p/7460030.html
Copyright © 2020-2023  润新知