PostSharp. Альтернативы
Я тут подумал, что несправедливо было бы обойти стороной сравнение PostSharp и других продуктов предоставляющих АОП. Ниже будут рассмотрены особенности использования, плюсы и минусы различных подходов. Но не думайте что PostSharp является серебрянной пулей. =)
Можно почитать и википедию насчет АОП и фреймворков для .Net платформы. Я посмотрел несколько перечисленных там фреймворков лично и по документированности и простоте использования остановился на PostSharp.
Containers (Инверсия зависимостей)
Большинство фреймворков направленных на инверсию зависимостей включают в себя некоторые возможности аспектно-ориентированного программирования. Для большинства достаточно простых технических требований, таких как трейсинг и обработка исключений применяемых к сервисам приложения, их возможностей хватает. Но их нельзя применить для более сложных и комплексных аспектов, которые могут применяться так же к объектам пользовательского интерфейса или к доменным объектам.
Продукты: Spring.NET, Castle Windsor, Microsoft Unity
Плюсы:
- Вы уже используете фреймворк для инверсии зависимостей
- Аспекты могут быть настроены после сборки
- Некоторые аспекты (трейсинг и обработка исключений) могут быть уже реализованы в вашем фреймворке.
Минусы:
- Очень ограниченные возможности в плане АОП
- Ваши объекты должны создаваться с помощью контейнера предоставляемого фреймворком. Такой способ нельзя применить для элементов пользовательского интерфейса, и во многих случаях для доменных объектов тоже.
- Не работает со статическими, не публичными и/или не виртуальными методами. Так же не будет работать применение на поля, свойства и события классов.
- Нет, или же плохое инструментирование для Visual Studio
Функциональное программирование
Функциональное программирование (с помощью анонимных методов и лямбда выражений) может быть решением такой проблемы как автоматическое повторение действия при неудачно проведенной транзакции.
Плюсы:
- Стандартный С#. Не требуется никаких дополнительных зависимостей в вашей сборке.
- Работа с уже знакомыми технологиями (я о анонимных методах и лямбда выражениях).
- В некоторых случаях, результат по объему кода такой же малый как и с АОП.
Минусы:
- Невозможно автоматически передать контекст из исполняемого кода в аспект. Например, у вас не получится реализовать трейсинг с помощью функционального программирования.
- Придется дописывать код в каждый метод, к которому вы хотите добавить аспект. Настоящее АОП может применяться к множеству методов буквально одной строчкой кода и поддерживает сложные правила для выборки методов к применению.
- Композиция аспектов получается менее удобная. Если у вас к одному и тому же методу применено два аспекта, и позже вы решили изменить порядок применения, то вам придется переписать все места, где вы их использовали.
Генерация кода
АОП и генерация кода – это два неконкурирующих подхода в метапрограммировании. Генерация кода фокусируется на производстве нового кода основанного на указанных артефактах более высокого уровня абстракции. АОП особенно хорош в объединении кода бизнес логики и технического (инфраструктурного) кода.
Продукты: CodeSmith
Плюсы:
- Достаточно легко сгенерировать сложный участок кода, поскольку все разработчики работают с С# или VB.
- Итоговый код на C#/VB может быть легко открыт в Visual Studio и подвергнут дебагингу, как любой другой кусок кода.
Минусы:
- В отличие от АОП, исходники ответственные за генерацию другого кода обычно пишутся в виде XML файла.
- Эта технология не может как бы то ни было подсовывать новые инструкции в существующий код или же модифицировать его поведение.
MSIL трансформация
С ростом популярности PostSharp, авторы фреймворка предпринимали неоднократные попытки использовать трансформацию MSIL для добавления нового поведения в программы. Т.к. PostSharp сам по себе использует PostSharp SDK, то доступны самые продвинутые способы трансформации кода. Нет таких задач которые можно было бы реализовать на других платформах, а на PostSharp – нет.
Продукты: Mono.Cecil, Microsoft.CCI, CCISharp.
Плюсы:
- Устраняют зависимость от PostSharp.dll для времени исполнения программы (однако то же самое можно сделать с помощью PostSharp SDK)
- Перечисленные фреймфорки бесплатны и за ними стоят большие компании.
Минусы:
- Требуется продвинутое знание устройства и работы MSIL. Заметим, что используя MSIL в целом легко написать прототип, но в разы сложнее написать преобразование кода работающее в любых условиях.
- Вы будете постоянно переизобретать колесо. Библиотеки преобразовании MSIL в общем случае низкоуровневые и они не предоставляют высокоуровневых плюшек имеющихся в арсенале PostSharp SDK.
- Преобразования реализованные таким путем, как правило, плохо работают в композиции к одному и тому же методу.
- Нет инструментов для Visual Studio.
Динамические языки
Большинство динамических языков предоставляют возможность мета-программирования, которая позволяет вам модифицировать структуру и поведение программы в процессе ее исполнения. Можно использовать такое мета-программирование для выделения модулей проходящих сквозь слои приложения.
Плюсы:
- Мета-программирование на динамических языках просто, т.к. сами языки были придуманы для этого, это их основная направленность.
Минусы:
- Придется полностью переключиться на динамический язык. А это не простой выбор.
- Мета-программирование может оказаться слишком мощным инструментом для вас. Более знакомые подходы и инструменты все же предпочтительнее.
- Нет инструментов для Visual Studio.
Сравнение технологий предоставляющих АОП
Где вы можете применить аспекты?
| PostSharp MSIL transformation |
Transparent Proxy Microsoft Unity |
JIT-Emitted Proxy Spring.NET, Castle Windsor |
JIT-Emitted Subclass Spring.NET, Castle Windsor |
|
| Методы реализующие интерфейс | Да | Да | Да | Да |
| Виртуальные публичные методы | Да | Только с MarshalByRefObject | Да | |
| Не виртуальные публичные методы | Да | Только с MarshalByRefObject | Да | |
| Виртуальные защищенные методы | Да | Да | ||
| Все методы (включая private, protected, static) | Да | |||
| Внешние методы (определенные в других сборках) | Да | |||
| Конструкторы | Да | |||
| Поля | Да | |||
| Свойства | Да | |||
| События | Да |
Другие особенности
| PostSharp MSIL transformation |
Transparent Proxy Microsoft Unity |
JIT-Emitted Proxy Spring.NET, Castle Windsor |
JIT-Emitted Subclass Spring.NET, Castle Windsor |
|
| Изменение аспекта после сборки | Да | Да | Да | |
| Не влияет на время сборки | Да | Да | Да | |
| Использование простого конструктора взамен фабрики | Да | |||
| Поддержка Silverlight & Compact Framework | Да |
По материалам на сайте PostSharp. Обожаю PostSharp! =)
Hard'n'heavy!
Нет обратных ссылок на эту запись.