如何在Castle.DynamicProxy中使用IInterceptor?(How use IInterceptor in Castle.DynamicProxy?)
如何 in How use 使用
2023-09-14 09:12:35 时间
参考:https://www.it1352.com/1796724.html
我写了一个这样的例子
简单计算器类:
public class Calculator { public int Add(int a, int b) { return a + b; } }
实现了DynamicProxy提供的"IInterceptor"
[Serializable] public abstract class Interceptor : IInterceptor { public void Intercept(IInvocation invocation) { ExecuteBefore(invocation); invocation.Proceed(); ExecuteAfter(invocation); } protected abstract void ExecuteAfter(IInvocation invocation); protected abstract void ExecuteBefore(IInvocation invocation); }
创建了一个Interceptor类,并从"Interceptor"类继承
public class CalculatorInterceptor : Interceptor { protected override void ExecuteBefore(Castle.DynamicProxy.IInvocation invocation) { Console.WriteLine("Start"); } protected override void ExecuteAfter(Castle.DynamicProxy.IInvocation invocation) { Console.WriteLine("End"); } }
但是当我使用它不起作用时!!
static void Main(string[] args) { ProxyGenerator generator = new ProxyGenerator(); Calculator c = generator.CreateClassProxy<Calculator>(new CalculatorInterceptor()); var r = c.Add(11, 22); Console.WriteLine(r); Console.ReadKey(); }
我例外地看到了这样的东西:
START 33 END
但仅显示
33
我该如何纠正?!
解决方案
尝试将方法Add设为虚拟.
public class Calculator { public virtual int Add(int a, int b) { return a + b; } }
代理生成器创建一个继承Calculator的新类.因此,方法Add获得重写以使拦截成为可能.
I wrote an example like this
Simple Calculator class :
public class Calculator { public int Add(int a, int b) { return a + b; } }
implemented "IInterceptor" that provided by DynamicProxy
[Serializable] public abstract class Interceptor : IInterceptor { public void Intercept(IInvocation invocation) { ExecuteBefore(invocation); invocation.Proceed(); ExecuteAfter(invocation); } protected abstract void ExecuteAfter(IInvocation invocation); protected abstract void ExecuteBefore(IInvocation invocation); }
Created an Interceptor class and inherited from "Interceptor" class
public class CalculatorInterceptor : Interceptor { protected override void ExecuteBefore(Castle.DynamicProxy.IInvocation invocation) { Console.WriteLine("Start"); } protected override void ExecuteAfter(Castle.DynamicProxy.IInvocation invocation) { Console.WriteLine("End"); } }
but when I used it NOT working !!!
static void Main(string[] args) { ProxyGenerator generator = new ProxyGenerator(); Calculator c = generator.CreateClassProxy<Calculator>(new CalculatorInterceptor()); var r = c.Add(11, 22); Console.WriteLine(r); Console.ReadKey(); }
I excepted to see something like this :
START 33 END
but only show
33
How I can correct it ?!
解决方案
Try to make the method Add virtual.
public class Calculator { public virtual int Add(int a, int b) { return a + b; } }
The proxy generator creates a new class inheriting Calculator. Thus, the method Add gets an override to make interception possible.
获得方法名
System.Reflection.MethodBase.GetCurrentMethod().Name;
相关文章
- 如何使用python读取txt文件中的数据
- 干货分享|“傻白甜”如何创建自己的微信小程序
- cad如何自定义填充案,springboot定义拦截器
- ORA-01719: outer join operator (+) not allowed in operand of OR or IN ORACLE 报错 故障修复 远程处理
- Oracle 视图 DBA_HIST_PDB_IN_SNAP 官方解释,作用,如何使用详细说明
- Oracle 视图 V$MEMORY_RESIZE_OPS 官方解释,作用,如何使用详细说明
- Oracle 等待事件 Enqueues:IN,InstanceNumber 官方解释,作用,如何使用及优化方法
- 方法掌握MySQL中IN方法的威力(mysql的in)
- MySQL语句如何分页?一步步教你实现!(Note: This article is written in Simplified Chinese. The title reads How to paginate MySQL statements? Let us guide you step by step! in English.)(分页mysql语句)
- Linux如何使用命令行创建进程?(linux创建进程)
- 如何在Linux系统中定时执行sh脚本?How to schedule the execution of a sh script in Linux?(linux定时执行sh)
- 子查询MySQL:实现多条件 IN 子查询(mysql多条件in)
- MySQL 中的 IN 语句分析(mysql语句in)
- 斯坦福AI实验室:如何打造基于计算机视觉的智能医院
- 方法利用SQL Server中的IN方法提升数据查询效率(sqlserver的in)
- 如何在MySQL数据库中添加密码(mysql数据库添加密码)
- 如何有效运用SQL Server的IN语句(sqlserver用in)
- 如何修复MySQL主从复制的故障(mysql 主从修复)
- 语句SQL Server中使用IN语句处理多值查询(sqlserver中in)
- MSSQL被锁定:如何解决?(mssql被锁怎样解锁)
- Oracle IN 的用法介绍(oracle in怎么用)
- MySQL中使用IN关键字时,字符串的长度有限制吗(mysql中in长度)
- MySQL中IN操作符的用法与注意事项(mysql中in的写法)
- 深入分析MySQL中IN语句的性能问题(mysql中in性能分析)
- MySQL中如何使用IN操作符(mysql中in怎么写)
- 学习MySQL中如何使用diff函数(mysql中diff函数)
- 限制解除Oracle中IN语句数量限制(oracle中in的数量)
- 使用Oracle中的IN条件实现复杂查询(oracle中in条件)