Я хочу знать разницу между использованием пользовательских атрибутов C# и структуры AOP (например, PostSharp). Как выбрать между ними?C# Атрибуты и парадокс Aop
ответ
Пользовательские атрибуты способы декларирования метаданных элементов кода, понимаемые другими элементами вашей системы, включая такие вещи, как компиляторы, АОП, проверки двигателей и т.д ...
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.
Хороший ответ. Могу ли я предложить переместить абзац «Пользовательские атрибуты - способы объявления ...» к началу вашего ответа? В этом и заключается суть проблемы - атрибуты могут использоваться для самых разных вещей, но сами не делайте ничего. Рамка AOP использует атрибуты для собственно * do * stuff. –
Спасибо. Согласился с вашим редактированием. –
Спасибо, ребята. Это ясно сейчас –
- 1. Парадокс апострофа и обратной косы
- 2. константной переменной парадокс
- 3. Атрибуты интернационализации и C#?
- 4. Как обойти парадокс таксономии?
- 5. Javascript напечатанный парадокс
- 6. Функция определения парадокс
- 7. Java: Парадокс дня рождения
- 8. Парадокс быстрой инициализации
- 9. 'Парадокс дня рождения'
- 10. День рождения Парадокс
- 11. зимуют LazyInitializing парадокс
- 12. Неявный парадокс конверсии
- 13. Кортежи рождения парадокс
- 14. Буквальной строка присваивание парадокс
- 15. C# AOP Пользовательский атрибут Unity
- 16. Spring-AOP и SLF4J
- 17. TestNG и Spring AOP
- 18. Spring Security и AOP
- 19. Весенние транзакции и AOP
- 20. C# Атрибуты и замещения метаданных
- 21. C# Атрибуты и их использование
- 22. lambdas и атрибуты в C#
- 23. день рождения парадокс быстрый поиск
- 24. Spring AOP и Post Construct
- 25. Spring AOP и RequestMapping Аннотация
- 26. Spring AOP и ClassNotFoundException: org.springframework.core.convert.converter.ConvertingComparator
- 27. Виндзорские перехватчики AOP и кэширование
- 28. Apache CXF и Spring AOP
- 29. AOP и пользовательское хранилище данных
- 30. AspectJ AOP и Spring вместе
AOP - это парадигма программирования, а атрибуты - это детали реализации C# (или любой другой язык, который их использует). Они находятся в двух разных масштабах. Один из способов реализации АОП - использование атрибутов, но АОП - это гораздо более широкое понятие. –