Аспектно-ориентированное программирование?

Как мы можем применить атрибуты к функции класса с помощью АОП в C #?

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

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


person Jaswant Agarwal    schedule 01.09.2009    source источник


Ответы (2)


В C # нет большой поддержки АОП.

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

-- Редактировать

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

person Noon Silk    schedule 01.09.2009
comment
хмм .. пожалуйста, подскажите, какой подход лучше ООП или АОП в C #? - person Jaswant Agarwal; 01.09.2009
comment
Jaswant: см. stackoverflow.com/ questions / 232884 / и другие. - person Noon Silk; 01.09.2009
comment
Почему PostSharp никогда не будет так хорош, как Java? С AOP вы можете сделать очень много, и PostSharp, кажется, может сделать все это. - person ; 05.09.2009

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

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

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

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

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

person Alfamale    schedule 08.04.2010