Qu’est-ce que la POA ? Pour citer l’Encyclopédie Baidu : AOP est l’abréviation de Programmation Orientée aux Aspects, ce qui signifie : une technologie de programmation orientée face afin d’assurer une maintenance unifiée des fonctions du programme via des méthodes de pré-compilation et des agents dynamiques en temps réel. Il existe deux principales façons d’implémenter AOP : l’une est l’implantation statique au moment de la compilation, l’avantage est une grande efficacité, l’inconvénient est le manque de flexibilité, et postsharp sous .net est le représentant (celui-ci est chargé). L’autre méthode est les proxies dynamiques, qui présentent les avantages et inconvénients opposés aux premiers, créant dynamiquement des proxys pour le type cible et les interceptant via des appels proxy. Ce que peut faire AOP, dans les cas d’usage courants, c’est le traitement des transactions, la journalisation, etc. Parlons de la façon dont Autofac implémente AOP, Autofac est un très bon conteneur IOC sous .net et de très bonnes performances (le conteneur le plus efficace sous .net), et AOP est tout simplement un tigre. L’AOP d’Autofac est implémenté via la partie centrale du projet Castle (également un conteneur) appelée Autofac.Extras.DynamicProxy, qui, comme son nom l’indique, est implémenté comme un proxy dynamique.
Préparation avant utilisation :
Installez le paquet Nuget Autofac, Autofac.Extras.DynamicProxy, et trois références seront ajoutées après l’installation réussie
Maintenant, c’est officiellement lancé !
Étape 1 : Créer un intercepteur
Voici un exemple d’intercepteur simple qui affiche le nom de la méthode interceptée, une liste de paramètres et le résultat de retour
Étape 2 : Enregistrer l’intercepteur dans le conteneur Autofac
L’intercepteur doit être enregistré dans le conteneur Aufofac, soit par type d’intercepteur, soit par nom, ce qui rend la méthode d’utilisation de l’intercepteur différente (comme expliqué plus loin).
Injection de noms constructeur. Register(c => nouveau CallLogger(Console.Out)). <IInterceptor>Nommés (« appels de journal ») ;
Injection de type constructeur. Register(c = > nouveau CallLogger(Console.Out)) ;
Étape 3 : Activer l’intercepteur
Il existe deux façons principales d’activer l’intercepteur : EnableInterfaceInterceptors(), EnableClassInterceptors().
La méthode EnableInterfaceInterceptors crée dynamiquement un proxy d’interface
La méthode EnableClassInterceptors créera une sous-classe proxy de la classe cible, et il convient de noter ici qu’elle n’interceptera que la méthode virtuelle et la supplantera
Activez le code d’exemple Interceptor :
Étape 4 : Indiquez le type que vous souhaitez intercepter
Il y a deux façons de faire :
Le premier type : Ajouter un attribut de caractéristique au type
Le second type consiste à injecter dynamiquement l’intercepteur lorsque le type d’enregistrement est transféré au conteneur
Étape 5 : Tester l’effet
1. Interception par procuration
Code de classe cercle :
2. Interception de proxy d’interface
Code d’interface IShape :
Code de classe cercle :
|