0 Tage Serie
csharp / expert
Snippet

Dynamische Interzeption mit DispatchProxy

DispatchProxy ist ein leistungsstarker Mechanismus zur dynamischen Implementierung des Decorator-Musters. Im Gegensatz zu schweren Mocking-Frameworks ist es Teil der Standardbibliothek und ermöglicht das Abfangen von Aufrufen an Interface-Methoden zur Laufzeit. Dies ist ideal für querschnittliche Belange wie Protokollierung, Profiling oder die Implementierung von Test-Doubles, ohne für jedes Interface manuell Wrapper-Klassen schreiben zu müssen.

snippet.cs
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Reflection;
public interface IService { void DoWork(); }
public class ServiceProxy : DispatchProxy
{
private object? _target;
protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
{
Console.WriteLine($"Before calling {targetMethod?.Name}");
var result = targetMethod?.Invoke(_target, args);
Console.WriteLine($"After calling {targetMethod?.Name}");
return result;
}
public static T Create<T>(T target) where T : class
{
object proxy = Create<T, ServiceProxy>();
((ServiceProxy)proxy)._target = target;
return (T)proxy;
}
}
Erklärung
1
protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
Der zentrale Punkt, an dem alle Methodenaufrufe auf der Proxy-Instanz zur Verarbeitung umgeleitet werden.
2
Create<T, ServiceProxy>()
Eine statische Factory-Methode, die einen Laufzeittyp generiert, der T implementiert und von ServiceProxy erbt.