Sobes.tech
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):

  1. Interceptori liidese määratlus:

    // Interceptori liides
    public interface IInterceptor
    {
        void Intercept(IInvocation invocation);
    }
    
  2. 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.");
        }
    }
    
  3. 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);