9

Ich schrieb ein Beispiel wie diese KlasseWie verwenden Sie IInterceptor in Castle.DynamicProxy?

Einfache Rechners:

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

implementiert "IInterceptor", die

[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); 
} 

eine Interceptor-Klasse Erstellt von Dynamic zur Verfügung gestellt und erbte von "Interceptor" -Klasse

aber wenn ich es nicht funktionierte !!!

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 ausgenommen, so etwas zu sehen:

START 
33 
END 

aber zeigen nur

33 

Wie ich es korrigieren?

Antwort

11

Versuchen Sie, die Methode Add virtuell zu machen.

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

Der Proxy-Generator erstellt eine neue Klasse erbt Calculator. Somit erhält die Methode Add eine Überschreibung, um das Abfangen zu ermöglichen.

+0

ja, scheint in Ordnung, aber eine Frage, das Ergebnis ist START ENDE 33, wie ich vor und nach der richtigen Weise einstellen und Ergebnis wie dieses sehen kann 33 START ENDE, kann ich dies in Interceptor-Klasse für richtige Methoden aufrufen ?? !! – user3153878

+1

@ user3153878 der Interceptor wird direkt vor und nach dem 'Add'-Aufruf ausgeführt, aber Sie schreiben das Ergebnis danach in die Konsole (execute before -> execute Add -> Ausführen nach -> write result) Wenn Sie die Konsole erstellen Rufen Sie innerhalb der 'Add'-Methode auf, Sie sollten das gewünschte Ergebnis erhalten. –

0

Sie müssen die korrekte Überladung verwenden und sowohl das Zielobjekt als auch den Interceptor übergeben, den Sie verwenden möchten. Die Methode sollte in etwa so aussehen:

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

nein ich habe diese Überlastung nicht, du liegst falsch! :( – user3153878

1

Die andere Option ist eine ICalculator Schnittstelle

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

und erbt Ihre Klasse von dieser Schnittstelle

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

Ihre dynamische Proxy des CreateInterfaceProxyWithTarget Methode

var proxyGenerator = new ProxyGenerator(); 

ICalculator calculator = new Calculator() 

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

Console.WriteLine(proxy.Add(1, 2)); 
verwenden würde, dann machen

Dies wird los von der virtuellen von Ihrem Rechner Klasse, die meiner Meinung nach schlechtes Design ist, es sei denn, Sie haben Grund, die Methode in der Zukunft zu überschreiben.