Що таке AOP? Цитата з Baidu Encyclopedia: AOP — це скорочення від Аспектно-орієнтованого програмування, що означає: технологія для програмування на обличчя для досягнення єдиного підтримки функцій програми через методи попередньої компіляції та динамічних агентів під час виконання. Існує два основні способи реалізації AOP: один — статична імплантація під час компіляції, перевага — висока ефективність, недолік — відсутність гнучкості, а postsharp під .net є репрезентативним (це платно). Інший метод — це динамічні проксі, які мають протилежні переваги та недоліки, динамічно створюючи проксі для цільового типу та перехоплюючи їх через проксі-дзвінки. Що може зробити AOP, типові випадки використання — це обробка транзакцій, ведення логів тощо. Давайте поговоримо про те, як Autofac реалізує AOP, Autofac — це дуже хороший IOC-контейнер під .net і дуже хороша продуктивність (найефективніший контейнер у .net), плюс AOP — це просто тигр. AOP Autofac реалізовано через основну частину проєкту Castle (також контейнерний) під назвою Autofac.Extras.DynamicProxy, який, як випливає з назви, реалізований як динамічний проксі.
Підготовка перед використанням:
Встановіть пакет Nuget Autofac, Autofac.Extras.DynamicProxy, і після успішної установки буде додано три посилання
Тепер це офіційно почалося!
Крок 1: Створіть перехоплювач
Нижче наведено приклад простого перехоплювача, який відображає назву перехопленого методу, список параметрів і результат повернення
Крок 2: Зареєструйте перехоплювач у контейнері Autofac
Перехоплювач має бути зареєстрований у контейнері Aufofac — за типом перехоплювача або за назвою, що робить спосіб використання перехоплювача іншим (як буде розглянуто далі).
Введення назви Будівельник. Register(c => новий CallLogger(Console.Out)). <IInterceptor>Названі ("лог-дзвінки");
Типове введення Будівельник. Register(c => новий CallLogger(Console.Out));
Крок 3: Увімкніть перехоплювач
Існує два основних способи активації перехоплювача: EnableInterfaceInterceptors(), EnableClassInterceptors().
Метод EnableInterfaceInterceptors динамічно створює проксі інтерфейсу
Метод EnableClassInterceptors створює проксі-клас підкласу цільового класу, і слід зазначити, що він лише перехоплюватиме віртуальний метод і перезапише метод
Увімкнути зразковий код перехоплювачів:
Крок 4: Вкажіть тип, який хочете перехопити
Є два способи:
Перший тип: Додати атрибут ознаки до типу
Другий тип — це динамічне введення перехоплювача при передачі реєстраційного типу в контейнер
Крок 5: Перевірте ефект
1. Проксі перехоплення
Код класу кола:
2. Перехоплення проксі інтерфейсу
Код інтерфейсу IShape:
Код класу кола:
|