АОП зависит от двух факторов:
- способность вводить дополнительный код в существующий блок кода
- Механизм для размещения условия о том, где код должен быть введен.
Это обычно называют ткачеством кода. Это специализация в рамках более масштабного исследования трансформации программы.
Скомпилированные языки JIT имеют больше возможностей для реализации кодирования, чем статически скомпилированные программы, поскольку в байт-кодексе/IL сохраняется дополнительная информация. Они также поддерживают отражение, которое позволяет управлять кодом во время выполнения.
Delphi.NET и Prism имеют одинаковый доступ к этим возможностям, как и любой другой язык .NET.
Есть две рамки AOP для Delphi Win32, о которых я знаю. Первый - MeAOP, о котором уже упоминалось. Второй - Infra. Оба проекта используют аналогичный подход к АОП. Они используют комбинацию RTTI и умных манипуляций с указателями для перехвата вызовов метода, поэтому вы можете запускать дополнительный код до или после вызова метода. Вы определяете свою сквозную функцию как подкласс класса AOP в структуре. Вы регистрируете методы, которые хотите перехватить, передав имя метода в виде строкового аргумента в структуру AOP.
Оба фреймворка по-прежнему активно развиваются и на самом деле больше по объему, чем просто АОП. К сожалению, документация несколько разрежена (и в случае Infra в основном на португальском языке)
Еще один проект, предпринятый AOP с помощью исходного кода, скомпоновавшего в 2004 году с некоторым успехом. В основном они построили аспектный инструмент поверх инструмента преобразования программ общего назначения под названием DMS и использовали его для ввода кода в файлы исходного текста delphi до компиляции. На их аспектно-ориентированный язык в первую очередь влиял AspectJ.
http://www.gray-area.org/Research/GenAWeave/ имеет ссылки на оригинальную бумагу и презентацию, а также некоторые видео процесса преобразования.
Возможно также использовать аппаратное обеспечение времени исполнения для выполнения этого. Его метод, используемый некоторыми профайлерами для ввода счетчиков и трассировки стека в исполняемый код без изменения исходного источника. Аналогичный метод может быть использован для того, чтобы вводить сквозные задачи в статически скомпилированный исполняемый файл. Хорошим примером этого является проект PinTool.
Для призмы Delphi есть теперь готовая поддержка AOP: http://prismwiki.codegear.com/en/Cirrus – Miel 2010-09-07 15:16:33