2015-02-28 3 views
2

Я хочу знать разницу между использованием пользовательских атрибутов C# и структуры AOP (например, PostSharp). Как выбрать между ними?C# Атрибуты и парадокс Aop

+1

AOP - это парадигма программирования, а атрибуты - это детали реализации C# (или любой другой язык, который их использует). Они находятся в двух разных масштабах. Один из способов реализации АОП - использование атрибутов, но АОП - это гораздо более широкое понятие. –

ответ

5

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

PostSharp выполняет IL (промежуточный язык), т. е. после компиляции он вводит IL в определенные моменты вашей сборки на основе конфигурации/атрибутов. Например, вы можете добавить настраиваемый атрибут к методу, и во время компиляции PostSharp будет писать IL, чтобы перехватить этот метод и предоставить вам поведение во время выполнения.

https://www.postsharp.net/aop.net/msil-injection

PostSharp является одним из способов реализации АОП, есть много других, в том числе динамических прокси (например Castle.Core), которые могут перехватывать методы во время выполнения, обеспечивая динамические подклассы классов вы, желающих продлить.

В обоих примерах атрибуты могут дать вам средство настройки поведения этих функций

Например, у вас есть метод:

public int Add(int x, int y) 
{ 
    return x + y; 
} 

И вы хотите, чтобы обеспечить ведение журнала или диагностики для этого метод, путь добавления этого кода вручную (журнал гипотетического каротажа API):

public int Add(int x, int y) 
{ 
    log.Enter("Add", x, y); 
    log.Leave("Add", x, y); 
    return x + y; 
} 

Вы отвлекаете от цели методы, и она начинает грязную воду при рассмотрении сложности метода и принципов единой ответственности.

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

Таким образом, вам необходимо указать способ, с помощью которого вы хотите применить регистрацию к методу Добавить. Удобный способ помечать методы с атрибутом:

[Log] 
public int Add(int x, int y) 
{ 
    return x + y; 
} 

Мы добавили метаданные для метода Add ([Log] Атрибут), чтобы указать, что мы хотим войти этот метод (и вернулся обратно к способу, который делает не нарушают принципов единой ответственности), однако сам по себе атрибут относительно бессмыслен.

Необходимо что-то интерпретировать пользовательский атрибут и предоставить механизм для перехвата вызова метода и добавления вызовов log.Enter, log.Leave. Здесь мы выбираем что-то вроде PostSharp или Dynamic proxy или других фреймворков AOP.

+0

Хороший ответ. Могу ли я предложить переместить абзац «Пользовательские атрибуты - способы объявления ...» к началу вашего ответа? В этом и заключается суть проблемы - атрибуты могут использоваться для самых разных вещей, но сами не делайте ничего. Рамка AOP использует атрибуты для собственно * do * stuff. –

+0

Спасибо. Согласился с вашим редактированием. –

+0

Спасибо, ребята. Это ясно сейчас –

Смежные вопросы