user3153878 user3153878 - 1 month ago 22
C# Question

How use IInterceptor in Castle.DynamicProxy?

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 ?!

Answer

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.

Comments