Czym jest AOP? Cytując Baidu Encyclopedia: AOP to skrót od Aspect Oriented Programming, co oznacza: technologię programowania zorientowanego na twarze, mającą na celu ujednolicone utrzymanie funkcji programu poprzez metody prekompilacji i dynamiczne agenty w czasie działania. Istnieją dwa główne sposoby implementacji AOP: jeden to statyczna implantacja w momencie kompilacji, zaletą jest wysoka wydajność, wadą brak elastyczności, a postsharp pod .net jest reprezentantem (jest to opłata). Drugą metodą są dynamiczne proxy, które mają przeciwne zalety i wady od pierwszej, dynamicznie tworząc proxy dla typu celu i przechwytując je za pomocą wywołań proxy. Co AOP potrafi, to typowe przypadki użycia to przetwarzanie transakcji, logowanie itd. Porozmawiajmy o tym, jak Autofac implementuje AOP – Autofac to bardzo dobry kontener IOC pod .net i bardzo dobra wydajność (najefektywniejszy kontener pod .net), a AOP to po prostu tygrys. AOP Autofac jest implementowany poprzez rdzeń projektu Castle (również kontener) o nazwie Autofac.Extras.DynamicProxy, który, jak sama nazwa wskazuje, jest zaimplementowany jako dynamiczny proxy.
Przygotowanie przed użyciem:
Zainstaluj pakiet Nuget Autofac, Autofac.Extras.DynamicProxy, a po pomyślnej instalacji zostaną dodane trzy referencje
Teraz oficjalnie się rozpoczęło!
Krok 1: Stwórz przechwytującego
Poniżej znajduje się przykład prostego przechwytywacza, który wyświetla nazwę przechwyconej metody, listę parametrów oraz wynik zwrotny
Krok 2: Zarejestruj przechwytującego w kontenerze Autofac
Przechwytujący musi być zarejestrowany w kontenerze Aufofac, albo według typu przechwytywacza, albo nazwy, co różni sposób użycia przechwytującego (jak omówiono później).
Wstrzykiwanie nazw Budowniczcie. Register(c => nowy CallLogger(Console.Out)). Nazwa <IInterceptor>("log-calls");
Wtrysk typów Budowniczcie. Register(c => nowy CallLogger(Console.Out));
Krok 3: Włącz przechwytującego
Istnieją dwa główne sposoby włączenia interceptora: EnableInterfaceInterceptors(), EnableClassInterceptors().
Metoda EnableInterfaceInterceptors dynamicznie tworzy proxy interfejsu
Metoda EnableClassInterceptors tworzy klasę proxy podklasy klasy docelowej i należy zauważyć, że przechwytuje tylko metodę wirtualną i nadpisuje ją
Włącz przykładowy kod Interceptora:
Krok 4: Wskaż typ, który chcesz przechwycić
Są dwa sposoby:
Pierwszy typ: Dodaj atrybut cechowy do typu
Drugi typ polega na dynamicznym wstrzykiwaniu przechwytywacza, gdy typ rejestracji jest przekazywany do kontenera
Krok 5: Sprawdź efekt
1. Przechwycenie przez zastępstwo
Kod klasy kołowej:
2. Przechwytywanie przez interfejs proxy
Kod interfejsu IShape:
Kod klasy kołowej:
|