Middle+
Mis on interceptor?
sobes.tech AI
Vastus AI-lt
C# Interceptor on mehhanism, mis võimaldab püüda meetodite väljakutseid, objekti omaduste ja sündmuste pöördumisi ajal, mil programm töötab. See võimaldab sekkuda standardse täitmisprotsessi, lisada oma loogikat enne või pärast algse meetodi väljakutset, muuta argumente või väljakutse tulemust.
Peamised omadused ja rakendusvaldkonnad:
- Dünaamilise proxy objekti genereerimine: Interceptorid kasutatakse sageli koos raamatukogudega, mis genereerivad dünaamilisi proxy objekte (näiteks Castle DynamicProxy, NProxy). Proxy objekt ümbritseb sihtobjekti ja püüab kõik sellele suunatud pöördumised.
- Aspekt-põhine programmeerimine (AOP): Interceptorid on üks võtme mehhanisme AOP teostamiseks, võimaldades eraldada läbivad aspektid (logimine, vahemälu, turvalisus, tehingute haldus) ja rakendada neid paljudele objektidele ilma nende algse koodi muutmiseta.
- Mockimine ja testimine: Kasutatakse, et luua mock-objekte või stube üksustest testides, võimaldades emuleerida reaalsete sõltuvuste käitumist.
- Käitumise lisamine jooksvalt: Annab võimaluse lisada või muuta objektide käitumist ilma nende algse koodi muutmata või pärimise kasutamiseta.
Näide Castle DynamicProxy kasutamisest (üks populaarsemaid raamistikke):
-
Interceptori liidese määratlus:
// Interceptori liides public interface IInterceptor { void Intercept(IInvocation invocation); } -
Interceptori rakendus:
// Näide logimise interceptori rakendusest public class LoggingInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine($"Meetodi väljakutse: {invocation.Method.Name}"); try { invocation.Proceed(); // Algse meetodi väljakutse } catch (Exception ex) { Console.WriteLine($"Viga meetodis {invocation.Method.Name}: {ex.Message}"); throw; } Console.WriteLine($"Meetod {invocation.Method.Name} lõpetatud."); } } -
Interceptori kasutamine:
// DynamicProxy kasutamine proxy objekti loomisel interceptori abil using Castle.DynamicProxy; // Sihtklassi näide public class TargetClass { public virtual void SomeMethod(int value) { Console.WriteLine($"TargetClass.SomeMethod sees väärtusega: {value}"); } } // Proxy generaatori ja interceptori loomine var generator = new ProxyGenerator(); var interceptor = new LoggingInterceptor(); // Proxy objekti loomine, mis püüab TargetClass väljakutseid var proxyObject = generator.CreateClassProxy<TargetClass>(interceptor); // Meetodi väljakutse proxy objekti kaudu proxyObject.SomeMethod(123);