Санкт-Петербургский государственный университет
Опубликован: 25.07.2014 | Доступ: свободный | Студентов: 1041 / 81 | Длительность: 17:26:00
Лекция 14:

Использование аспектно-ориентированного программирования (АОП) в среде Visual Studio 2013

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >

17.7. Второй пример применения АОП для новой версии Azure

Рассмотрим теперь "Hands-on Lab 6: Implementing Throttling Behavior", где иллюстрируется ограничение функциональности под нагрузкой с использованием сервисов функционального блока Autoscaling Application Block. Отдельный компонент Autoscaler занимается мониторингом диагностической информации и, в зависимости от текущей нагрузки на облако, устанавливает свойство ThrottlingMode в файле конфигурации исходного проекта. В зависимости от значения этого свойства какие-то из методов класса веб-страницы могут изменять свое поведение (листинг 17.3).

//Веб-роль, на странице которой тестируется Autoscaling Application Block
public partial class Default : System.Web.UI.Page {
	protected override void OnPreRenderComplete(EventArgs e) {
            base.OnPreRenderComplete(e);
            string throttlingMode = 
                RoleEnvironment.GetConfigurationSettingValue("ThrottlingMode");
            switch (throttlingMode)
            {
                case "HighActivity":
                    this.ThrottlingLabel.Text = "Работа при высокой активности…";
                    break;
                default:
                    this.ThrottlingLabel.Text = "Работа при обычной  активности…";
			  this.DoSomeUsualWork();
                    break;
            }
      }
 
 private void DoSomeUsualWork() {/*…*/}
}
    
Листинг 17.3.

Данный метод можно перенести в аспект и тогда целевой класс будет сконцентрирован только на решении своей задачи, в то время как компонент Autoscaler и бесшовная интеграция с аспектом обеспечит реакцию на повышенную нагрузку. Задачу можно было бы решить аналогично предыдущему примеру, но здесь есть препятствие в виде вызова закрытого в целевом классе метода DoSomeUsualWork(). Для того, чтобы он стал доступным замещающему наследнику, компоновщик аспектов мог бы принудительно сделать этот метод защищенным. Однако это нарушит инкапсуляцию целевого класса, и единственный способ сохранить ее - использовать рефлексию .NET. Закрытые члены целевого класса становятся полями его аспектного наследника, которые инициализируются в конструкторе. Также предположим, что в замещающем наследнике целевого класса нам понадобится вызвать метод OnPreRenderComplete следующего по иерархии базового класса System.Web.UI.Page. Защищенные и открытые методы целевого класса используются в его замещающем аспектном наследнике без ограничений. Итоговый аспект представлен в листинге 17.4.

using System.Reflection;
[AspectDotNet.ReplaceBaseClass]
public class AspectClass : _Default {
MethodInfo DoSomeUsualWork;
 
      public AspectClass() {
      	Type BaseType = this.GetType().BaseType;
		//Получение ссылки на закрытый метод целевого класса _Default
            DoSomeUsualWork = BaseType.GetMethod("DoSomeUsualWork", 
BindingFlags.NonPublic | BindingFlags.Instance);
		//Ссылка на метод базового класса System.Web.UI.Page
PageOnPreRenderComplete = base.GetType().BaseType.
GetMethod("OnPreRenderComplete", BindingFlags.NonPublic | BindingFlags.Instance);
      }
        
      protected override void OnPreRenderComplete(EventArgs e) {
	   //Вызываем метод базового класса System.Web.UI.Page
     	   PageOnPreRenderComplete.Invoke(this, new object[] { e });
     	   string throttlingMode = 
                   RoleEnvironment.GetConfigurationSettingValue("ThrottlingMode");
              switch (throttlingMode) {
                case "HighActivity":
	  //Использование в аспекте члена целевого класса _Default
                    this.ThrottlingLabel.Text = "Работа при высокой    активности…";
                    break;
                default:
                    this.ThrottlingLabel.Text = "Работа при обычной активности…";
  	  //Вызов закрытого члена целевого класса _Default
  DoSomeUsualWork.Invoke(this, null);
                    break;
         }
      }
}
    
Листинг 17.4.

17.8. Использование компоновщика аспектов для подмены целевой сборки на сборку с внедренными аспектами перед публикацией в облаке

Новая версия системы Aspect.NET, совместимая с новейшей интегрированной средой MS Vusial Studio 2013, доступна в настоящее время в виде компоновщика аспектов (который реализован как консольное приложение) и набора скриптов для управления процессом сборки решений, таким образом, чтобы обеспечить подмену исходной бинарной сборки на ее новую версию с внедненными аспектами перед публикацией в облаке. В настоящее время версия Aspect.NET Framework для VS 2013 (т.е. графический пользовательский интерфейс) находится в процессе разработки.

Вызов компоновщика в консольном варианте имеет вид:

weaver -aspects MyAspect.dll -in HelloWorld.exe -out AspectHelloWorld.exe
    

Рассмотрим алгоритм разработки и бесшовной интеграции аспектов в MS VS 2012 с помощью Aspect.NET:

Вход: Проект с исходными текстами целевого приложения, к которому нужно применить аспекты.

  • Создаем отдельный проект для аспекта (типа Class Library) и объединяем его с целевым проектом в рамках общего решения (solution).
  • Чтобы обеспечить интеграцию аспекта с целевой сборкой, в свойствах его проекта на вкладке Build Events добавляем соответствующий скрипт
:: Укажем папку со сборкой целевого проекта
set TargetAssemblyDir=C:\HelloWorld\HelloWorld\bin\Debug\
:: Название его сборки
set TargetAssembly=HelloWorld
:: Ее расширение
set TargetAssemblyExt=.exe
:: Для каждого нового аспекта или целевого проекта необходимо менять лишь 
:: вышеуказанные переменные
  
:: Зададим путь к директории Aspect.NET
set AspectDotNetDir=C:\AspectDotNet
set TargetAssemblyPath=%TargetAssemblyDir%%TargetAssembly%%TargetAssemblyExt%
set TargetAssemblyName=%TargetAssembly%%TargetAssemblyExt% 
cd %AspectDotNetDir%
weaver -aspects $(TargetPath) -in %TargetAssemblyPath% -out  %TargetAssemblyName%
:: Подмена сборки в целевом проекте результирующей
move /Y %TargetAssemblyName% %TargetAssemblyPath%
    

17.9. Резюме

Аспектно-ориентированное программирование и система Aspect.NET успешно применимы для платформы Microsoft Azure с использованием среды Visual Studio 2013, что показано на содержательных примерах использования АОП для определения и внедрения в облачные приложения в виде аспектов протоколирующих действий, реализованных с помощью библиотеки Microsoft Enterprise Library Integration Pack for Microsoft Azure. Применение Aspect.NET позволяет гибко управлять функциональностью ASP.NET - страниц, добавляя вызовы необходимых действий (кода) при выполнении типовых действий над страницами.

В настоящее время в группе проекта Aspect.NET под моим научным руководством разработана библиотека аспектов AspectCloud для облачных вычислений в системе Azure.

Ключевые термины

Аспектно-ориентированное программирование (АОП) - новый перспективный подход к разработке и модернизации программ, предназначенный для поддержки сквозной функциональности (cross-cutting concerns) в программах.
Aspect.NET - инструмент АОП для платформы .NET, разработанный группой под руководством автора курса.
Microsoft Enterprise Library Integration Pack for Windows Azure - решение компании Microsoft для выделения "сквозной функциональности" при разработке облачных приложений ( требует для этого модификации их исходного кода).

Краткие итоги

Аспектно-ориентированное программирование и система Aspect.NET успешно применимы для платформы Microsoft Azure с использованием среды Visual Studio 2013, что показано на содержательных примерах использования АОП для определения и внедрения в облачные приложения в виде аспектов протоколирующих действий, реализованных с помощью библиотеки Microsoft Enterprise Library Integration Pack for Windows Azure. Применение Aspect.NET позволяет гибко управлять функциональностью ASP.NET - страниц, добавляя вызовы необходимых действий (кода) при выполнении типовых действий над страницами.

Набор для практики

Вопросы

  1. Что такое АОП?
  2. Что такое Aspect.NET?
  3. Каковы методы применения АОП и Aspect.NET для облачных вычислений?
  4. Что такое Microsoft Enterprise Library Integration Pack for Microsoft Azure?

Упражнения

  1. Разработайте и опубликуйте с использованием Visual Studio свое облачное Web-приложение.Затем, применив систему Aspect.NET (http://www.aspectdotnet.org), разработайте аспект, модифицирующий поведение приложений при загрузке страницы в браузер и других типовых действиях. Опубликуйте в облаке модифицированное приложение и проверьте его в работе.
  2. Изучите библиотеку Microsoft Enterprise Library Integration Pack for Microsoft Azure и попробуйте применить новую версию Aspect.NET для пропуска примеров, описанных в лекции.

Темы для курсовых работ, рефератов, эссе

  1. Применение АОП для облачных вычислений (реферат).
  2. Библиотека Microsoft Enterprise Library Integration Pack for Microsoft Azure (реферат).

Дополнительные материалы, презентации

Презентация к данной лекции: VS_2013_Course_17.pptx.

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Александр Калинин
Александр Калинин

Осенью прошёл курс и получил ключ. Но т.к. уже имел действующую подписку, то ключом не воспользовался. Сейчас захожу сюда, а про DreamSpark вообще ни слова. Где же мой ключ?