Что такое AOP? Цитата из Baidu-энциклопедии: 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 создаст подкласс прокси-класса целевой класса, и следует отметить, что он перехватывает только виртуальный метод и переопределяет метод
Включить примерный код Interceptor:
Шаг 4: Укажите тип, который хотите перехватить
Есть два способа:
Первый тип: Добавить атрибут признака к типу
Второй тип — динамическое введение перехватчика при передаче регистрационного типа в контейнер
Шаг 5: Проверьте эффект
1. Перехват по прокси
Код класса круга:
2. Перехват прокси интерфейса
Код интерфейса IShape:
Код класса круга:
|