Hvad er AOP? Citat fra Baidu-encyklopædien: AOP er forkortelsen for Aspect Oriented Programming, som betyder: en teknologi til ansigtsorienteret programmering for at opnå samlet vedligeholdelse af programfunktioner gennem prækompilationsmetoder og dynamiske agenter under kørsel. Der er to hovedmåder at implementere AOP på: den ene er statisk implantation ved kompilering, fordelen er høj effektivitet, ulempen er manglende fleksibilitet, og postsharp under .net er repræsentativ (dette er opkrævet). Den anden metode er dynamiske proxyer, som har modsatte fordele og ulemper af førstnævnte, idet de dynamisk skaber proxies for måltypen og opsnapper dem gennem proxy-opkald. Hvad AOP kan, er almindelige anvendelsestilfælde transaktionsbehandling, logning osv. Lad os tale om, hvordan Autofac implementerer AOP, Autofac er en meget god IOC-container under .net og har meget god ydeevne (den mest effektive container under .net), plus AOP er simpelthen en tiger. Autofacs AOP implementeres gennem kernedelen af Castle-projektet (også en container) kaldet Autofac.Extras.DynamicProxy, som, som navnet antyder, er implementeret som en dynamisk proxy.
Forberedelse før brug:
Installer Nuget-pakken Autofac, Autofac.Extras.DynamicProxy, og tre referencer vil blive tilføjet efter vellykket installation
Nu er det officielt startet!
Trin 1: Opret en interceptor
Nedenfor er et eksempel på en simpel interceptor, der viser navnet på den opsnappede metode, en liste over parametre og returresultatet
Trin 2: Registrer interceptoren i Autofac-containeren
Interceptoren skal registreres i Aufofac-containeren, enten efter interceptortype eller efter navn, hvilket gør metoden til at bruge interceptoren anderledes (som diskuteret senere).
Navneinjektion Bygger. Register(c => ny CallLogger(Console.Out)). Navngivet <IInterceptor>("log-calls");
Typeinjektion Bygger. Register(c => ny CallLogger(Console.Out));
Trin 3: Aktiver aflytningsmaskinen
Der er to hovedmåder at aktivere interceptoren på: EnableInterfaceInterceptors(), EnableClassInterceptors().
EnableInterfaceInterceptors-metoden opretter dynamisk en interfaceproxy
EnableClassInterceptors-metoden vil oprette en subklasseproxy-klasse af målklassen, og det skal bemærkes, at den kun vil opsnappe den virtuelle metode og tilsidesætte metoden
Aktivér Interceptor eksempelkode:
Trin 4: Angiv typen, du vil opsnappe
Der er to måder:
Den første type: Tilføj en feature-attribut til typen
Den anden type er at injicere interceptoren dynamisk, når registreringstypen overføres til beholderen
Trin 5: Test effekten
1. Proxy-aflytning
Cirkelklassekode:
2. Interface proxy-aflytning
IShape-grænsefladekode:
Cirkelklassekode:
|