Очки соединения в аспектно-ориентированном программировании
В настоящее время я изучаю AOP и его важные части, такие как Advice, Pointcuts и Join Points. Я прочитал очень понятное объяснение о том, что такое Советы и Pointcuts по этой ссылке. Аспектно-ориентированное программирование против объектно-ориентированного программирования
Однако мне трудно понять, что такое точки соединения. Из того, что я прочитал, точки соединения - это четко определенные места в структуре программы, где аспект может быть сплетен в коде рекомендаций.
Но, когда дело доходит до реального примера, я не смог найти ни одного хорошего примера, чтобы понять пример точек соединения.
Как видно из приведенного выше примера, если Advice и Poincuts - это то, что написано ниже, то где мы определяем точки соединения?
Классический подход:
void set...(...) {
:
:
Display.update();
}
Совет:
after() : set() {
Display.update();
}
Poincuts:
pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);
1 ответ
void set...(...)
это точка соединения
Как вы знаете, Аспект - это объединение Концерна, Pointcut и Joinpoint
- Реализация сквозного концерна называется Концерном.
- Четко определенное место в классе, к которому будет присоединена проблема, - это точка соединения.
- Местом, где указываются точки соединения (с помощью конфигурации или кода), является Pointcut.
Концерн - это то, что важно для одного или нескольких заинтересованных лиц. Кроме того, проблемы могут быть концептуально разделены на две категории (реализация для каждой может быть одинаковой):
Побочный эффект: проблема, которая не меняет поведение в точке соединения, а вместо этого вводит дополнительные действия.
Забота о лесозаготовках является хорошим примером побочного эффекта,
например, каждый вызов целевого метода (это точка соединения) BankWithdrawalHandler.Execute(ICommand command)
сначала позвонит в концерн LoggingConcern.Execute(ICommand command)
который сможет работать до и после Execute
метод, регистрирующий такие вещи, как время начала / время окончания / общее время / в параметрах / выходных параметрах и т. д.
Побочный эффект может:
- При необходимости проверьте / запишите входные параметры в целевой точке и выполните любую дополнительную обработку.
- При необходимости проверьте / запишите выходной результат в целевой точке и выполните любую дополнительную обработку.
Совет: проблема, которая потенциально изменит вход и / или выход целевого метода.
Задача кэширования - простой пример - например, всякий раз, когда среда выполнения выполняет целевой метод (это точка соединения) Repository.Find<T>(long id)
метод CacheConcern.Find<T>(long Id)
будет настроен для запуска в первую очередь и позволит только продолжить вызов на Repository.Find()
метод, если значение не найдено в кеше.
Совет может:
- Проверьте входные параметры в выбранной точке и измените их при необходимости
- Отмените или избегайте выполнения целевого метода и замените его другой реализацией
- Проверьте выходной результат целевого метода и измените или замените его при необходимости
В.NET существует ряд устоявшихся методов для реализации pointcut:
- Пост сборки ил плетения /PostSharp
- Инверсия зависимости (Инверсия контроля (IoC) и Инверсия зависимости (DI))
- Перехват /DynamicProxy