Was ist AOP? Zitat aus der Baidu-Enzyklopädie: AOP ist die Abkürzung für Aspect Oriented Programming, was bedeutet: eine Technologie für gesichtsorientierte Programmierung, um eine einheitliche Wartung von Programmfunktionen durch Vorkompilierungsmethoden und dynamische Agenten während der Laufzeit zu erreichen. Es gibt zwei Hauptmöglichkeiten, AOP zu implementieren: Die eine ist die statische Implantation zur Kompilierungszeit, der Vorteil ist die hohe Effizienz, der Nachteil ist der Mangel an Flexibilität, und PostSharp unter .NET ist der Repräsentant (das ist aufgeladen). Die andere Methode sind dynamische Proxys, die die gegenteiligen Vor- und Nachteile der ersteren haben, indem sie dynamisch Proxys für den Zieltyp erstellen und diese durch Proxy-Anrufe abfangen. Was AOP kann, sind gängige Anwendungsfälle wie Transaktionsverarbeitung, Logging usw. Lassen Sie uns darüber sprechen, wie Autofac AOP implementiert: Autofac ist ein sehr guter IOC-Container unter .net und sehr leistungsfähig (der effizienteste Container unter .net), außerdem ist AOP einfach ein Tiger. Das AOP von Autofac wird durch den Kernteil des Castle-Projekts (auch ein Container) namens Autofac.Extras.DynamicProxy implementiert, der, wie der Name schon sagt, als dynamischer Proxy implementiert ist.
Zubereitung vor der Anwendung:
Installiere das Nuget-Paket Autofac, Autofac.Extras.DynamicProxy, und nach erfolgreicher Installation werden drei Referenzen hinzugefügt
Jetzt hat es offiziell begonnen!
Schritt 1: Erstellen Sie einen Abfanggerät
Nachfolgend ist ein Beispiel für einen einfachen Interceptor, der den Namen der abgefangenen Methode, eine Liste von Parametern und das Rückgabeergebnis anzeigt
Schritt 2: Registrieren Sie den Abfanger im Autofac-Container
Der Abfanger muss im Aufofac-Container registriert sein, entweder nach Abfangtyptyp oder nach Namen, was die Verwendung des Abfangers unterscheidet (wie später erläutert).
Namensinjektion Bauherr. Register(c => neuer CallLogger(Console.Out)). Benannt <IInterceptor>("Log-Calls");
Typinjektion Bauherr. Register(c => neuer CallLogger(Console.Out));
Schritt 3: Aktivieren Sie den Abfangsender
Es gibt zwei Hauptmöglichkeiten, den Interceptor zu aktivieren: EnableInterfaceInterceptors(), EnableClassInterceptors().
Die EnableInterfaceInterceptors-Methode erzeugt dynamisch einen Interface-Proxy
Die EnableClassInterceptors-Methode erstellt eine Unterklasse-Proxy-Klasse der Zielklasse, und es sollte hier beachtet werden, dass sie nur die virtuelle Methode abfängt und die Methode überschreibt
Interceptor-Beispielcode aktivieren:
Schritt 4: Gib den Typ an, den du abfangen möchtest.
Es gibt zwei Möglichkeiten:
Der erste Typ: Fügen Sie dem Typ ein Merkmalsattribut hinzu
Der zweite Typ besteht darin, den Interceptor dynamisch einzuspritzen, wenn der Registrierungstyp auf den Container übertragen wird
Schritt 5: Teste die Wirkung
1. Proxy-Abfang
Kreisklassencode:
2. Schnittstellen-Proxy-Abfang
IShape-Schnittstellencode:
Kreisklassencode:
|