Castle Dynamic Proxy - 2.2
项目地址:Castle Dynamic Proxy
Castle DynamicProxy 动态生成透明代理类型,实体不需要继承
MarshalByRef、ContextBoundObject 便可以实现代理类
基于透明代理的功能,可以实现对方法调用的拦截处理,例如 NHibernate 用它实现延迟加载
DP 的使用非常简单,内部没有使用反射,而是采用 Emit、委托等方式生成代理类型,调用真
实类的方法,性能方面也没有太多损失
基本示例
引用的命名空间:
?
1
2
using
Castle.Core.Interceptor;
using Castle.DynamicProxy;
被代理的实体类:
?
1
2
3
4
5
6
7
8
9
public class SimpleSamepleEntity
{
public virtual string Name { get; set; }
public virtual int Age { get; set; }
public override string ToString()
{
return string.Format("{{ Name: \"{0}\", Age: {1} }}",
this.Name, this.Age);
}
}
定义一个拦截器,调用代理类的方法时使用拦截器进行拦截处理:
?
1
2
3
4
5
6
7
8
9
1
0
1
1
public class CallingLogInterceptor : IInterceptor
{
private int _indent = 0;
private void PreProceed(IInvocation invocation)
{
if (this._indent > 0)
Console.Write(" ".PadRight(this._indent * 4, ' '));
this._indent++;
Console.Write("Intercepting: " + invocation.Method.Name +
"(");
if (invocation.Arguments != null &&
invocation.Arguments.Length > 0)
for (int i = 0; i < invocation.Arguments.Length; i++)