AOP разработан, чтобы охватить то, что он называет сквозными задачами, то есть функциональностью, которая требуется для многих объектов в системе, но которая не является основной для проблем этих объектов. Если такие требования удовлетворяются путем кодирования сквозной задачи в объекты всей системы, мы получаем грязную, сложную в обслуживании реализацию, разбитую на множество объектов.
Классическим примером сквозной проблемы является ведение журналов: ведение журналов важно для реальной, работающей системы и должно быть реализовано во всей этой системе, но на самом деле это не касается объектов в этой системе: системе может потребоваться объект расчета налога с продаж для реализации ведения журнала, но на самом деле ведение журнала не является проблемой самого объекта расчета налога с продаж. АОП позволяет нам определять эти общесистемные (сквозные) требования отдельно от нашей основной бизнес-логики, а затем объединять их во время выполнения или во время компиляции.
AOP работает, перехватывая вызовы методов на объектах. Точки перехвата известны как pointcuts, а метод перехвата является рекомендуемым методом, а код, рекомендованный для перехваченного метода, называется советом. Я знаком с AOP только через AOP Framework Spring.Net, который позволяет вам определять и применять pointcut и советы как через файлы конфигурации, так и программно. Spring.Net AOP имеет четыре типа рекомендаций: до, после, вокруг и броски, которые вызываются при перехвате рекомендованного метода до вызывается рекомендованный метод, после он вызывается, как до, так и после его вызова, и когда генерируется исключение соответственно. Применяемый ли с помощью конфигурации или программно метод , рекомендованный , ничего не знает о Spring.Net AOP или даже о том, что ему было рекомендовано.
Другой пример полезного использования АОП - транзакции. Если мы попытаемся реализовать это в коде внутри объектов, мы получим объекты, которые должны знать, что они действуют внутри транзакции, что, на мой взгляд, не является желательной особенностью дизайна. АОП позволяет нам создавать и координировать транзакции извне с объектами, участвующими в транзакции, что может дать гораздо более стабильный и удобный для обслуживания дизайн.
Документация Spring.Net очень хороша для объяснения AOP в целом и реализации AOP Spring.Net в частности и содержит множество примеров. На это стоит обратить внимание, даже если вы не планируете использовать платформу Spring.Net AOP.