Vad är AOP? Citat från Baidu-encyklopedin: AOP är förkortningen för Aspect Oriented Programming, vilket betyder: en teknik för ansiktsorienterad programmering för att uppnå enhetligt underhåll av programfunktioner genom förkompileringsmetoder och dynamiska agenter under körning. Det finns två huvudsakliga sätt att implementera AOP, det ena är statisk implantation vid kompilering, fördelen är hög effektivitet, nackdelen är brist på flexibilitet, och postsharp under .net är representativ (detta är laddat). Den andra metoden är dynamiska proxyer, som har motsatta fördelar och nackdelar jämfört med den förra, och skapar dynamiskt proxyer för måltypen och avlyssnar dem genom proxysamtal. Vad AOP kan göra, vanliga användningsområden är transaktionshantering, loggning osv. Låt oss prata om hur Autofac implementerar AOP, Autofac är en mycket bra IOC-container under .net och mycket bra prestanda (den mest effektiva containern under .net), plus att AOP helt enkelt är en tiger. Autofacs AOP implementeras genom kärndelen av Castle-projektet (även det en container) kallat Autofac.Extras.DynamicProxy, som, som namnet antyder, är implementerat som en dynamisk proxy.
Förberedelse före användning:
Installera Nuget-paketet Autofac, Autofac.Extras.DynamicProxy, och tre referenser kommer att läggas till efter en lyckad installation
Nu har det officiellt startat!
Steg 1: Skapa en interceptor
Nedan är ett exempel på en enkel interceptor som visar namnet på den avlyssnade metoden, en lista med parametrar och returresultatet
Steg 2: Registrera interceptorn i Autofac-containern
Interceptorn måste registreras i Aufofac-containern, antingen efter interceptortyp eller namn, vilket gör metoden för att använda interceptorn annorlunda (som diskuteras senare).
Namninjektion byggare. Register(c => ny CallLogger(Console.Out)). <IInterceptor>Namngivna ("log-calls");
Typinjektion byggare. Register(c => nya CallLogger(Console.Out));
Steg 3: Aktivera interceptorn
Det finns två huvudsakliga sätt att aktivera interceptorn: EnableInterfaceInterceptors(), EnableClassInterceptors().
Metoden EnableInterfaceInterceptors skapar dynamiskt en gränssnittsproxy
EnableClassInterceptors-metoden skapar en subklassproxyklass av målklassen, och det bör noteras här att den endast kommer att intercepta den virtuella metoden och åsidosätta metoden
Aktivera exempelkod för Interceptor:
Steg 4: Ange vilken typ du vill avlyssna
Det finns två sätt:
Den första typen: Lägg till ett funktionsattribut till typen
Den andra typen är att dynamiskt injicera interceptorn när registreringstypen överförs till behållaren
Steg 5: Testa effekten
1. Proxy-avlyssning
Cirkelklasskod:
2. Gränssnittsproxy-avlyssning
IShape-gränssnittskod:
Cirkelklasskod:
|