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.