城堡动态代理创建

时间:2009-09-16 14:56:05

标签: c# castle-dynamicproxy linfu

我正在实现一个设计,我的图层将位于客户端和服务器之间,无论我从服务器获取什么对象,我都会将其包装在透明代理中并提供给客户端,这样我就可以跟踪更改的内容在对象中,所以当保存它时,我只会发送更改的信息。

我查看了城堡动态代理,linfu,虽然他们可以生成代理类型,但是他们不能接受现有的对象并将它们包装起来。

想知道是否可以使用这些框架,或者是否有任何其他框架可以实现这一点......

2 个答案:

答案 0 :(得分:6)

我们使用无状态实体,并且由于ASP.NET GridView的行为,我需要创建一个只包装现有对象的代理。

我创建了一个以这种方式保存目标实例的拦截器:

public class ForwardingInterceptor : IInterceptor
{
    private object target;

    private Type type;

    public ForwardingInterceptor(Type type, object target)
    {
        this.target = target;
    }

    public void Intercept(IInvocation invocation)
    {
        invocation.ReturnValue = invocation.Method.Invoke(this.target, invocation.Arguments);
    }       
}

然后你可以简单地创建包装器代理:

this.proxyGenerator.CreateClassProxy(type, new ForwardingInterceptor(type, target));

答案 1 :(得分:4)

Castle Dynamic Proxy 3.x或更高版本可以做到这一点,但你必须记住,它只能拦截虚拟方法,所以它不是一个完美的抽象。