Aspect NET Using aspectoriented programming for trustworthy software

  • Slides: 17
Download presentation

Сайт Aspect. NET: Монография В. О. Сафонова “Using aspect-oriented programming for trustworthy software development”,

Сайт Aspect. NET: Монография В. О. Сафонова “Using aspect-oriented programming for trustworthy software development”, Wiley, 2008 (C) Сафонов В. О. 2013

Веб-роль, на странице которой тестируется Logging Application Block Листинг 1 //Веб-роль, на странице которой

Веб-роль, на странице которой тестируется Logging Application Block Листинг 1 //Веб-роль, на странице которой тестируется Logging Application Block public partial class Default : System. Web. UI. Page { //Сообщение отсылается в обработчике щелчка мыши по кнопке страницы protected void Log. Button_Click(object sender, Event. Args e) { Microsoft. Practices. Enterprise. Library. Logging. Logger. Write("Message from the Logging Application Block"); } } (C) Сафонов В. О. 2013

Проект с замещающим аспектным наследником Листинг 2 //Проект с замещающим аспектным наследником [Aspect. Dot.

Проект с замещающим аспектным наследником Листинг 2 //Проект с замещающим аспектным наследником [Aspect. Dot. Net. Replace. Base. Class] public class Aspect. Class : Default { protected void Log. Button_Click(object sender, Event. Args e) { Microsoft. Practices. Enterprise. Library. Logging. Logger. Write("Message from the Logging Application Block"); base. Log. Button_Click(sender, e); } } //Исходный проект, после отделения зависимости от Logging Application Block public partial class Default : System. Web. UI. Page { protected void Log. Button_Click(object sender, Event. Args e) {} } (C) Сафонов В. О. 2013

Веб-роль, на странице которой тестируется Autoscaling Application Block Листинг 3 //Веб-роль, на странице которой

Веб-роль, на странице которой тестируется Autoscaling Application Block Листинг 3 //Веб-роль, на странице которой тестируется Autoscaling Application Block public partial class Default : System. Web. UI. Page { protected override void On. Pre. Render. Complete(Event. Args e) { base. On. Pre. Render. Complete(e); string throttling. Mode = Role. Environment. Get. Configuration. Setting. Value("Throttling. Mode"); switch (throttling. Mode) { case "High. Activity": this. Throttling. Label. Text = "Работа при высокой активности…"; break; default: this. Throttling. Label. Text = "Работа при обычной активности…"; this. Do. Some. Usual. Work(); break; } } private void Do. Some. Usual. Work() {/*…*/} } (C) Сафонов В. О. 2013

Итоговый аспект Листинг 4 using System. Reflection; [Aspect. Dot. Net. Replace. Base. Class] public

Итоговый аспект Листинг 4 using System. Reflection; [Aspect. Dot. Net. Replace. Base. Class] public class Aspect. Class : _Default { Method. Info Do. Some. Usual. Work; public Aspect. Class() { Type Base. Type = this. Get. Type(). Base. Type; //Получение ссылки на закрытый метод целевого класса _Default Do. Some. Usual. Work = Base. Type. Get. Method("Do. Some. Usual. Work", Binding. Flags. Non. Public | Binding. Flags. Instance); //Ссылка на метод базового класса System. Web. UI. Page. On. Pre. Render. Complete = base. Get. Type(). Base. Type. Get. Method("On. Pre. Render. Complete", Binding. Flags. Non. Public | Binding. Flags. Instance); } protected override void On. Pre. Render. Complete(Event. Args e) { //Вызываем метод базового класса System. Web. UI. Page. On. Pre. Render. Complete. Invoke(this, new object[] { e }); string throttling. Mode = Role. Environment. Get. Configuration. Setting. Value("Throttling. Mode"); switch (throttling. Mode) { case "High. Activity": this. Throttling. Label. Text = "Работа при высокой активности…"; break; default: this. Throttling. Label. Text = " Работа при обычной активности…"; } Do. Some. Usual. Work. Invoke(this, null); break; } } (C) Сафонов В. О. 2013 //Использование в аспекте члена целевого класса _Default //Вызов закрытого члена целевого класса _Default

Скрипт для вкладки Build Events : : Укажем папку со сборкой целевого проекта set

Скрипт для вкладки Build Events : : Укажем папку со сборкой целевого проекта set Target. Assembly. Dir=C: Hello. WorldbinDebug : : Название его сборки set Target. Assembly=Hello. World : : Ее расширение set Target. Assembly. Ext=. exe : : Для каждого нового аспекта или целевого проекта необходимо менять лишь : : вышеуказанные переменные : : Зададим путь к директории Aspect. NET set Aspect. Dot. Net. Dir=C: Aspect. Dot. Net set Target. Assembly. Path=%Target. Assembly. Dir%%Target. Assembly. Ext% set Target. Assembly. Name=%Target. Assembly%%Target. Assembly. Ext% cd %Aspect. Dot. Net. Dir% weaver -aspects $(Target. Path) -in %Target. Assembly. Path% -out %Target. Assembly. Name% : : Подмена сборки в целевом проекте результирующей move /Y %Target. Assembly. Name% %Target. Assembly. Path% (C) Сафонов В. О. 2013