Аспектно-ориентированное программирование? - PullRequest
2 голосов
/ 01 сентября 2009

Как мы можем применить атрибуты к функции класса, используя AOP в C #?

ОБНОВЛЕНИЕ: Мне немного непонятно, в каком контексте следует использовать АОП? Поскольку мы можем использовать AOP для целей ведения журнала, безопасности (аутентификации), пожалуйста, предложите несколько других сценариев, где мы можем воспользоваться AOP

Можно ли использовать AOP для обмена данными между различными запущенными потоками в процессе приложения?

Ответы [ 2 ]

5 голосов
/ 08 апреля 2010

AOP разработан, чтобы охватить то, что он называет сквозными задачами, то есть функциональностью, которая требуется для многих объектов в системе, но которая не является основной для проблем этих объектов. Если такие требования удовлетворяются путем кодирования сквозной задачи в объекты всей системы, мы получаем грязную, сложную в обслуживании реализацию, разбитую на множество объектов.

Классическим примером сквозной проблемы является ведение журналов: ведение журналов важно для реальной, работающей системы и должно быть реализовано во всей этой системе, но на самом деле это не касается объектов в этой системе: системе может потребоваться объект расчета налога с продаж для реализации ведения журнала, но на самом деле ведение журнала не является проблемой самого объекта расчета налога с продаж. АОП позволяет нам определять эти общесистемные (сквозные) требования отдельно от нашей основной бизнес-логики, а затем объединять их во время выполнения или во время компиляции.

AOP работает, перехватывая вызовы методов на объектах. Точки перехвата известны как pointcuts, а метод перехвата является рекомендуемым методом, а код, рекомендованный для перехваченного метода, называется советом. Я знаком с AOP только через AOP Framework Spring.Net, который позволяет вам определять и применять pointcut и советы как через файлы конфигурации, так и программно. Spring.Net AOP имеет четыре типа рекомендаций: до, после, вокруг и броски, которые вызываются при перехвате рекомендованного метода до вызывается рекомендованный метод, после он вызывается, как до, так и после его вызова, и когда генерируется исключение соответственно. Применяемый ли с помощью конфигурации или программно метод , рекомендованный , ничего не знает о Spring.Net AOP или даже о том, что ему было рекомендовано.

Другой пример полезного использования АОП - транзакции. Если мы попытаемся реализовать это в коде внутри объектов, мы получим объекты, которые должны знать, что они действуют внутри транзакции, что, на мой взгляд, не является желательной особенностью дизайна. АОП позволяет нам создавать и координировать транзакции извне с объектами, участвующими в транзакции, что может дать гораздо более стабильный и удобный для обслуживания дизайн.

Документация Spring.Net очень хороша для объяснения AOP в целом и реализации AOP Spring.Net в частности и содержит множество примеров. На это стоит обратить внимание, даже если вы не планируете использовать платформу Spring.Net AOP.

4 голосов
/ 01 сентября 2009

C # не имеет большой поддержки AOP.

Существует фреймворк, PostSharp , который вы можете посмотреть. Это, вероятно, даст вам то, что вы хотите, но никогда не будет так хорошо, как Java.

- Правка

Если вы не хотите использовать Framework, такой как PostSharp, посмотрите на класс ContextBoundObject, а также (IIRC), DynamicProxy. Но оба они требуют либо изменения вашей цепочки наследования, либо изменения способа создания объектов.

...