Wat is AOP? Citaat uit de Baidu Encyclopedie: AOP is de afkorting van Aspect Oriented Programming, wat betekent: een technologie voor face-oriented programming om uniforme onderhoudsfuncties van programma's te bereiken via pre-compilatiemethoden en dynamische agenten tijdens runtime. Er zijn twee hoofdmanieren om AOP te implementeren: de ene is statische implantatie tijdens het compileren tijd, het voordeel is hoge efficiëntie, het nadeel is gebrek aan flexibiliteit, en postsharp onder .net is de representatieve (dit is belast). De andere methode zijn dynamische proxies, die de tegenovergestelde voordelen en nadelen hebben van de eerste, namelijk het dynamisch creëren van proxies voor het doeltype en deze onderscheppen via proxy calls. Wat AOP kan, veelvoorkomende gebruikssituaties zijn transactieverwerking, logging, enzovoort. Laten we het hebben over hoe Autofac AOP implementeert, Autofac is een zeer goede IOC-container onder .net en heeft zeer goede prestaties (de meest efficiënte container onder .net), plus AOP is gewoon een tijger. De AOP van Autofac wordt geïmplementeerd via het kerngedeelte van het Castle-project (ook een container), genaamd Autofac.Extras.DynamicProxy, dat, zoals de naam al doet vermoeden, als een dynamische proxy is geïmplementeerd.
Voorbereiding vóór gebruik:
Installeer het Nuget-pakket Autofac, Autofac.Extras.DynamicProxy, en na succesvolle installatie worden drie referenties toegevoegd
Nu is het officieel begonnen!
Stap 1: Maak een onderschepper aan
Hieronder staat een voorbeeld van een eenvoudige interceptor die de naam van de onderschepte methode, een lijst met parameters en het retourresultaat weergeeft.
Stap 2: Registreer de interceptor in de Autofac-container
De interceptor moet geregistreerd zijn in de Aufofac-container, hetzij op interceptortype, hetzij op naam, wat de methode van het gebruik van de interceptor anders maakt (zoals later besproken).
Naaminjectie Bouwer. Register(c => nieuwe CallLogger(Console.Out)). Named <IInterceptor>("log-calls");
Type-injectie Bouwer. Register(c => nieuwe CallLogger(Console.Out));
Stap 3: Schakel de onderschepper in
Er zijn twee hoofdmanieren om de interceptor te activeren: EnableInterfaceInterceptors(), EnableClassInterceptors().
De EnableInterfaceInterceptors-methode creëert dynamisch een interfaceproxy
De EnableClassInterceptors-methode zal een subklasse-proxyklasse van de doelklasse aanmaken, en het moet hier worden opgemerkt dat deze alleen de virtuele methode zal onderscheppen en de methode overschrijft
Schakel Interceptor voorbeeldcode in:
Stap 4: Geef aan welk type je wilt onderscheppen
Er zijn twee manieren:
Het eerste type: Voeg een feature-attribuut toe aan het type
Het tweede type is het dynamisch injecteren van de interceptor wanneer het registratietype naar de container wordt overgedragen
Stap 5: Test het effect
1. Proxy-onderschepping
Cirkelklassecode:
2. Interface proxy-onderschepping
IShape Interface Code:
Cirkelklassecode:
|