Диссертация (1148251), страница 15
Текст из файла (страница 15)
В свою очередь, бесшовное применениеаспектов к бизнес-логике облегчает реализацию нефункциональных требований.В таком ключе можно сказать, что Aspect.NET позволяет рассматривать самубизнес-логику как каркас, а вызовы её целевых методов — как генерациюсобытий, на которые подписаны действия аспектов:79public class LoggingAspect : Aspect {public static void Log(String s) {Console.WriteLine(s);}[AspectAction("%before %call *")]public static void LogBefore() {Log("Before: " + TargetMemberInfo.ToString());}}[AspectAction("%after %call *")]public static void LogAfter() {Log("After: " + TargetMemberInfo.ToString());}ЛИСТИНГ 23.
АСПЕКТ, ПОДПИСАННЫЙ НА ВЫЗОВЫ МЕТОДОВ ЛОГИРОВАНИЯТема применения Aspect.NET к разработке ASP.NET веб-приложенийвпервые подробно рассматривалась в работе [123], где автор с помощью действийbefore, instead, after реализовал библиотеку аспектов WebAspect со следующейфункциональностью:1) протоколирование;2) безопасность (аутентификация, авторизация, олицетворение(передача пользователю полномочий другого пользователя,необходимых для выполнения каких-либо действий);3) криптография строки запроса;4) криптография cookie-файлов;5) кодирование гипертекста;6) расширение пользовательского Web-интерфейса;7) защита от Cross-Site Scripting атаки.Также показано, что производительность исполнения сборки с внедреннымичерез Aspect.NET аспектами эквивалентна производительности сборки совставленными вручную вызовами действий аспектов. Поскольку PaaS технологияWeb Apps в облаке Microsoft Azure предполагает работу в рамках ASP.NET, торезультаты данной работы могут быть использованы и при построении облачныхприложений.
В основном, для разработки ASP.NET-приложений применяютсреду разработки Microsoft Visual Studio, поскольку в ней есть интеграция совстроенным сервером IIS [50]. Проект ASP.NET, кроме прочего, содержит файлы80разметки веб-страницы “.aspx” и код с её бизнес-логикой “.aspx.cs”. Компиляторпри построении веб-проекта создает сборку с бизнес-логикой в виде .dll файла, ккоторой консольное приложение компоновщика Aspect.NET (далее weaver)применяет аспекты. При развертывании локального веб-приложения MicrosoftVisual Studio помещает все результирующие файлы в специальную временнуюпапку со случайно сгенерированным именем и делает её корневой директориейсайта в IIS.
Исходя из этого, в работе [123] предлагается использовать следующийалгоритм для внедрения аспектов в веб-приложение с помощью Aspect.NET.1. Скомпилировать библиотеку WebAspect.2. Скомпилировать Web-приложение (например, WebAspectExample).3. Скопировать подсистему внедрения аспектов Weaver.exe, сборкуWebAspect.dll и связанные с ней файлы (WebAODLog.log4net) и сборки(например, AspectDotNet.dll, GMaps.dll, log4net.dll) в папку bin Webприложения.4. В папке bin Web-приложения запустить Weaver в режиме сканированияточек присоединений путем вызова следующей командной строки,например, для WebAspectExample: weaver -scan -aspects WebAspect.dll in WebAspectExample.dll -out joinpoints.xml.5.
Запустить Weaver в режиме внедрения путем вызова следующейкомандной строки, например, для WebAspectExample: weaver -weave joinpoints joinpoints.xml -out ~WebAspectExample.dll.6. Созданная сборка ~WebAspectExample.dll — результирующая сборка свнедренными в неё аспектами. Удалить сборку WebAspectExample.dll иизменитьназваниесборки~WebAspectExample.dllнаWebAspectExample.dll.Как можно видеть при данном подходе, внедрение аспектов с помощьюAspect.NET в веб-приложение, разработанное в Microsoft Visual Studio, требуетсущественных усилий и, вдобавок, у пользователя нет возможности отлаживатьдействия аспектов штатным отладчиком.81Таким образом, для возможности применять систему Aspect.NET дляполноценной разработки облачных веб-приложений на Microsoft Visual Studio,требуется глубокая интеграция компоновщика аспектов с этой средой разработки.Далее будут рассмотрены решения некоторых инженерных проблем адаптацииAspect.NET для интеграции с Microsoft Visual Studio.3.2 Реализация совместимости Aspect.NET с Microsoft Visual Studio 2015Современная разработка на Microsoft Azure подразумевает использованиеMicrosoft Visual Studio (VS) 2015, в которой серьезно упрощено развертываниеоблачных приложений.
Программисту достаточно сделать несколько щелчковмышью, чтобы его приложение отправилось в облако. Последняя опубликованнаяверсия Aspect.NET 2.1 совместима лишь с Microsoft Visual Studio 2008, т.к. именнос её COM-библиотекой по работе с отладочной информацией (msdia90.dll)сконфигурирован Microsoft Phoenix. Установка Microsoft VS более новой версииприводит к тому, что Microsoft Phoenix автоматически пытается использоватьобновленную msdia90.dll и завершается с ошибкой. К сожалению, с 2008 годаразвитиекросс-платформеннойкомпиляторовMicrosoftPhoenixсредыпостроенияпрекратилось.Приоптимизирующихэтомегоширокиевозможности всё ещё используются в академической среде, и несовместимость ссовременными версиями Microsoft VS является серьезным препятствием длятаких проектов.
Решение заключается в том, чтобы в директории компоновщикааспектов находилась библиотека с нужной версией, а также её манифестомmsdia90.manifest:82<?xml version="1.0" encoding="utf-8"?><asmv1:assemblymanifestVersion="1.0"xmlns="urn:schemas-microsoftcom:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" ><assemblyIdentity type="win32" name="msdia90" version="9.0.30729.4947"language="neutral" processorArchitecture="x86" /><file name="msdia90.dll"><comClassclsidthreadingModel="both"/></file></asmv1:assembly>ЛИСТИНГ 24.
ФАЙЛ MSDIA90.MANIFESTСледующей проблемой становится публикация средствами Microsoft VSрезультирующей сборки с внедренными аспектами в облако Microsoft Azure.Например, для облачного веб-приложения, после выбора в свойствах проектапункта контекстного меню Publish, процесс публикации заключается вкомпиляции проекта, упаковке его сборки вместе с используемыми библиотекамии другими служебными файлами в специальный архив, а затем передаче егослужбам Microsoft Azure.
В свою очередь, компоновщик аспектов в Aspect.NET— это консольное приложение, которое в виде параметров командной строкипринимает пути к сборкам: аспектной, целевой и результирующей:weaver -aspects MyAspect.dll -in HelloWorld.exe -out AspectHelloWorld.exeСледовательно, если бы удалось выполнить эту команду сразу после этапакомпиляции и подменить результирующей сборкой целевую, то Microsoft VSотправит на публикацию приложение с внедренными аспектами. Более того,теперь запуск на выполнение целевого проекта приведет к запуску проекта свнедренными аспектами, что облегчает аспектно-ориентированную разработкупрограмм. В итоге, автором разработан следующий алгоритм разработки ибесшовной интеграции аспектов в Microsoft VS 2015 с помощью Aspect.NET.Вход: Проект с исходными текстами целевого приложения, к которомунужно применить аспекты.1.Создаем отдельный проект для аспекта (типа Class Library) иобъединяем его с целевым проектом в рамках общего решения (solution).832.
Чтобы обеспечить интеграцию аспекта с целевой сборкой, в свойствахего проекта на вкладке Build Events добавляем соответствующий скрипт::: Укажем папку со сборкой целевого проектаset TargetAssemblyDir=C:\HelloWorld\HelloWorld\bin\Debug\:: Название его сборкиset TargetAssembly=HelloWorld:: её расширениеsetTargetAssemblyExt=.exe:: Для каждого нового аспекта или целевого проекта необходимо менять:: лишь вышеуказанные переменные:: Зададим путь к директории Aspect.NETset AspectDotNetDir=C:\AspectDotNetset TargetAssemblyPath=%TargetAssemblyDir%%TargetAssembly%%TargetAssemblyExt%set TargetAssemblyName=%TargetAssembly%%TargetAssemblyExt%cd %AspectDotNetDir%weaver -aspects $(TargetPath) -in %TargetAssemblyPath% -out%TargetAssemblyName%:: Подмена сборки в целевом проекте результирующейmove /Y %TargetAssemblyName% %TargetAssemblyPath%ЛИСТИНГ 25.
CMD-СКРИПТ ДЛЯ ИНТЕГРАЦИИ АСПЕКТА И ЦЕЛЕВОЙ СБОРКИ3. Выключаем процесс применения аспектов при неудачной компиляциицелевого проекта путем выбора "When the build updates the projectoutput" в опции “Run the post-build event”.4. Настраиваемпорядоксборкипроектов(ProjectBuildOrderвконтекстном меню аспектного проекта) так, чтобы первым собиралсяцелевой проект, затем аспектный.5. Устанавливаем целевой проект для запуска (в его контекстном меню"Set as StartUp Point").Выход: Решение (solution) с аспектным и не модифицированным целевымпроектом. При компиляции аспектного проекта будет происходить внедрениеаспектов, а при запуске в Microsoft VS — запуск результирующей сборки.
В своюочередь компиляция и запуск целевого проекта приведет к запуску исходногопроекта, без внедренных аспектов.При бесшовной интеграции аспектов с целевой сборкой желательно иметьвозможностьприменитьотладчикMicrosoftVSпритестированиирезультирующей сборки. Вся информация о связи исходного кода и точки84останова (breakpoint) в исполняемом файле содержится в pdb-файлах, которыепроизводит компилятор Microsoft VS. После применения компоновщикасоздается исполняемый файл с интегрированными аспектами, однако отладочныеpdb-файлы аспектного и целевого проекта не соответствуют ему. Это делаетневозможным установку точек останова в аспектах и пошаговую отладкурезультирующей сборки.Итак, наша последняя задача заключается в том, чтобы создать отладочныйpdb-файл, соответствующий результирующей сборке. В процессе своей работыкомпоновщик вставляет в целевую сборку дополнительные MSIL-инструкции длявызова действий аспектов, а также передачи в них контекста.
Эти операциипроизводятся с помощью Microsoft Phoenix, а Mono.Cecil отвечает за этапы 2, 4 и5 в приведенном в разделе 3.3 алгоритме по подстановке замещающегонаследника. Как Microsoft Phoenix, так и Mono.Cecil при преобразовании целевойсборки автоматически поддерживают соответствие с отладочной информацией.Инымисловами,присоответствующихпараметрахэтихинструментов,отладочный pdb-файл для результирующей сборки будет создан автоматически.Всё что нам теперь остается, это средствами Microsoft Phoenix добавитьотладочную информацию для новых MSIL-инструкций.
С учетом того, что ихдобавление не влияет на исходный текст целевого проекта, необходимо лишьскопироватьвпредшествующихновыеимMSIL-инструкцииинструкцийвотладочнуюцелевойсборке.информациюЭтоотреализуетсякопированием свойства DebugTag в классе Phx.IR.Instruction — высокоуровневогопредставления инструкций в Microsoft Phoenix. Теперь отладчик за один шагсможет выполнить новые инструкции и перейти внутрь действия аспекта, а далеебудет задействована отладочная информация аспектной сборки, которая ужесоздана компилятором .NET.853.3 Замещение аспектом целевого класса для перехвата событийКак уже упоминалось, платформа ASP.NET — это каркас, который предлагаетобщую архитектуру для ряда задач, а программист лишь уточняет поведениепрограммы в методах обратного вызова (callbacks).
Предположим, у нас есть вебстраница Default.aspx, на которой расположена кнопка LogButton. При её нажатиибудет изменено содержимое текстового элемента TextControl:public partial class Default : System.Web.UI.Page{//Обработчик щелчка мыши по кнопке страницыprotected void LogButton_Click(object sender, EventArgs e) {TextControl.Text = ”Click from LogButton…”;}}ЛИСТИНГ 26.