9

я написал пример, как этотКак использовать IInterceptor в Castle.DynamicProxy?

Простой класс Калькулятор:

public class Calculator 
{ 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

реализован "IInterceptor", обеспечиваемой 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); 
} 

создал класс перехватчик и унаследовал от Класс «Перехватчик»

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 

Как я могу это исправить?!

ответ

11

Попытка сделать метод Add виртуальной.

public class Calculator 
{ 
    public virtual int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

Прокси-генератор создает новый класс, наследующий Calculator. Таким образом, метод Add получает переопределение, чтобы сделать перехват возможным.

+0

да, похоже, но вопрос в том, что результат: START END 33 Как я могу установить до и после правильно и посмотреть результат, как этот START 33 END, могу ли я исправить это в классе Interceptor для правильных методов вызова ??! !! – user3153878

+1

@ user3153878 перехватчик выполняет прямо до и после вызова «Добавить», но вы записываете результат после этого в консоль (выполнить before -> выполнить Add -> execute after -> result result). Если вы создаете консоль вызовите метод 'Add', вы получите желаемый результат. –

0

Вы должны использовать правильную перегрузку и передать как целевой объект, так и перехватчик, который хотите использовать. Метод должен выглядеть следующим образом:

var proxy = generator.CreateClassProxy<Calculator>(new Calculator(), new CalculatorInterceptor()); 
+0

нет У меня нет этой перегрузки, вы ошибаетесь! :( – user3153878

1

Другой вариант заключается в сделать интерфейс ICalculator

public interface ICalculator 
{ 
    int Add(int a, int b); 
} 

и унаследовать класс от этого интерфейса

public class Calculator : ICalculator 
{ 
    public int Add(int a, int b) 
    { 
     return a + b; 
    } 
} 

Ваш динамический прокси затем использовать CreateInterfaceProxyWithTarget метод

var proxyGenerator = new ProxyGenerator(); 

ICalculator calculator = new Calculator() 

var proxy = proxyGenerator.CreateInterfaceProxyWithTarget(
    calculator, 
    ProxyGenerationOptions.Default, 
    new CalculatorInterceptor()); 

Console.WriteLine(proxy.Add(1, 2)); 

Это получает избавиться от виртуального от вашего класса Calculator, который, на мой взгляд, плохой дизайн, если у вас нет причин переопределять этот метод в будущем.

Смежные вопросы