Диссертация (1148251), страница 14
Текст из файла (страница 14)
Например, если вызов целевого метода в точкеприсоединения имеет вид р.М(), то TargetObject обозначает ссылку наобъект р. Если целевой метод статический, TargetObject равно null;4) TargetMemberInfo — это ссылка типа System.Reflection.MemberInfo наобъект, представляющий метаданные целевого метода;5) WithinMethod — это ссылка типа System.Reflection.MethodBase наметаданные, представляющие метод, в котором расположен вызовцелевого метода;6) WithinType — это ссылка типа System.Туре на определение класса, вкотором расположен вызов целевого метода;7) RetValue — это ссылка типа System.Object на результат, возвращаемыйцелевым методом. Для всех действий кроме %after имеет значение null;8) This — это ссылка типа System.Object на объект в целевой программе,внутри метода которого оказалось вставлено данное действие аспекта.Например, если вызов р.М() содержится внутри метода объекта X, то Xявляется ссылкой This для действия аспекта, применяемого к р.М().В дополнение к свойствам контекста, компоновщик обеспечивает “захват”аргументов, передавая их от целевого метода в аргументы действия аспекта.int Sum(int a, int b, int c){ … } //Целевой метод…/* Действие аспекта с первым и третьим захваченными у целевого метода аргументами*/[AspectAction(“%after %call *Sum(int, int, int) && %args(arg[0], arg[2]))]public static AspectAfterSum(int a, int c) { … }ЛИСТИНГ 20.
РАБОТА КОМПОНОВЩИКА С АРГУМЕНТАМИ ЦЕЛЕВОГО МЕТОДАПодробно синтаксис “захвата” аргументов рассмотрен в [112]. Нам жеосталось упомянуть, что данный подход “точечной” передачи нужных аргументов74выигрывает по накладным расходам по сравнению со способом, когда весь набораргументов целевого метода упаковывается в коллекцию объектов, и действиеаспекта вынуждено перебором выбирать нужные (например, PostSharp).
С другойстороны, явное указание нужных аргументов усиливает связь между аспектом иконкретным целевым методом. Это может быть оправдано в задачах АОПрефакторинга [54], но не при написании универсальных аспектов.В работе [112] применение аспекта иллюстрируется на примере работы спростым классом банковского счета, который поддерживает операцию снятиясредств withdraw(float):public class BankAccount {float account;public float withdraw(float amount){/*...*/ }}ЛИСТИНГ 21. КЛАСС BANKACCOUNTЕсли вынести проверку прав на совершение операции в аспект, то он будетвыглядеть таким образом:public class BankManagement : Aspect {[AspectAction(“%instead %call *BankAccount.withdraw(float)&& args(..)”)]public static float WithdrawWrapper(float amount) {BankAccount acc = (BankAccount) TargetObject;if (isLicenceValid(base.TargetMemberInfo.Name))return acc.withdraw(amount);Console.WriteLine("Withdraw operation is not allowed");return acc.Balance;}public static float isLicenceValid(string operation){/*...*/}}ЛИСТИНГ 22.
ПРОВЕРКА ПРАВ С ПОМОЩЬЮ АСПЕКТАДанное действие аспекта определяет "заглушку", которая будет вставленавместо целевого метода withdraw. Внутри действия происходит проверка прав навыполнение операции withdraw и вызывается исходная операция с тем же наборомпараметров, если авторизация прошла успешно. Доступ к целевому объекту иимени операции осуществляется через свойства TargetObject и TargetMemberInfoконтекста точки внедрения.Другой альтернативой могут служить IoC-контейнеры. Например, компанияMicrosoft позиционирует Enterprise Library (EL) как набор наиболее удачных75архитектурных решений, применимых в большинстве программных систем.
Посравнению с динамическим применением аспектов в EL, когда во времявыполнения программы среда .NET создает прокси-объекты в заданных местах,Aspect.NET вплетает действия на уровне MSIL-инструкций после этапакомпиляции целевой сборки, что влечет повышение производительности целевогоприложения. Достоинствами библиотеки EL является встроенная поддержка состороны среды выполнения .NET, а также возможность настройки аспектов безкомпиляции через конфигурационные XML-файлы. Однако следует учитывать,что при работе с облачными приложениями, перекомпиляция для внедренияаспектов не вызывает трудностей, т.к.
Microsoft Azure поддерживает прозрачноеразвертывание изменившегося приложения путем постепенного перезапускаотработавших экземпляров. Более того, “пост-обработка” Aspect.NET даетвозможность выбирать конкретные места применения действий аспектов.Компоновщик аспектов — это отдельное консольное приложение. Егопараметрами являются пути к сборкам аспектов и целевого приложения. Приработе в Microsoft Visual Studio требуется в свойствах проекта аспекта включитьего вызов в события пост-компиляции (post-build events).По сравнению с AspectJ в Aspect.NET отсутствуют многие возможности.1. Спецификация правил внедрения (pointcut) описывается в AspectJ какотдельная сущность, что позволяет комбинировать вместе различныеправила внедрения.2. Внедрение аспектов во время компиляции и при загрузке классов в JVM.3.
Вместо универсального механизма расширения целевого класса новымичленами и реализацией интерфейса (introduction) используется болеечастный способ замещающего аспектного наследника (будет описанниже, в разделе 3 главы 3).4. В Aspect.NET все аспекты являются статическими классами, временемих жизни нельзя управлять и их нельзя наследовать.765.
Возможность перехватывать исключения в момент их генерации исобытия доступа к полям целевого класса. В Aspect.NET можноперехватывать только вызовы методов.Тем не менее, в следующих разделах будет показано, что имеющихсявозможностей Aspect.NET достаточно для простых и эффективных аспектноориентированных решений при модуляризации сквозной функциональности воблачныхприложениях,ихаспектно-ориентированномрефакторингеибесшовной интеграции со сторонними библиотеками на платформе Microsoft.NET.2.6 Выводы по главеАОП позволяет разделять бизнес-логику и сквозную функциональность. еёвыделение в аспекты повышает связность целевых классов и улучшает метрикикачества кода. АОП-системы подобные PostSharp имеют гибкие возможности длясоздания своих аспектов, но не устраняют целиком зависимость от них целевогопроекта. После этого заменить АОП-инструмент (или отказаться от негополностью) становится затруднительно.В свою очередь, уже существуют сторонние библиотеки и службы, которыеберут на себя реализацию сквозной функциональности (например, MS EL).
Для ихбесшовного подключения к целевому проекту может применяться системаAspect.NETдляMSVS.ПрограммированиеаспектоввAspect.NETосуществляется в привычном программном и языковом окружении. Расширениеповедения обеспечивается за счет вставки необходимых действий перед, послеили вместо целевого метода, а также возможности создать наследника целевогокласса и подменить им исходный. Связывание проекта аспекта и бизнес-логикипроизводится программистом в специальном расширении MS VS, доступном дляустановки в галерее расширений MS VS.Компоновка аспектов с бизнес-логикой производится на этапе компиляцииаспектного проекта и с минимальными накладными расходами. Проведенные в77работе [89] измерения производительности, внедренных с помощью Aspect.NETаспектов, показали эффективность по времени сравнимую или даже меньшую,чем вызов той же функциональности в коде напрямую.
Однако у предложенногоподхода есть и недостатки — аспект имеет сильную связанность с целевымклассом, что снижает накладные расходы, но может препятствовать созданиюобобщенных, универсальных аспектов.78Глава 3. Применение и адаптация Aspect.NET дляразработки облачных веб-приложений в MicrosoftAzure3.1 Принципы реализации облачных веб-приложений на платформеMicrosoft Azure с помощью Aspect.NETСовременноепрограммноеобеспечениехарактеризуетсявысокойскоростью разработки, повторно используемыми решениями и переносимостьюмежду различными платформами. Достичь этого помогают каркасы (frameworks).Каркасы — набор классов в той или иной степени следующих паттернам“шаблонный метод” (template method), подписке на события через наблюдателя(observer) и разделение на уровни (layers).
Каркас представляет собой “скелет”приложения, а его расширение происходит через наследование специальныхклассов, переопределении их виртуальных методов и написание пользовательскихобработчиков системных событий.Благодаря разделению на уровни, пользовательский интерфейс задаетсядекларативно, а работа с базой данных производится через абстрактный “фасад”(façade). Особенно каркасы популярны при разработке веб-приложений: Node.js,Angular.js, JSP, ASP.NET, Azure SDK и пр.Таким образом, каркасы облегчают разработку систем, инкапсулируя всесложности нижележащей платформы.