Очки соединения в аспектно-ориентированном программировании

В настоящее время я изучаю 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
Другие вопросы по тегам