Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Safonov / AMPN_course_7.pptx
Скачиваний:
142
Добавлен:
16.04.2015
Размер:
425.38 Кб
Скачать

Aspect.NET - Обзор

Выделим всю сквозную функциональность в аспекты.Аспект состоит из:

Данных (полей)

Модулей (методов аспекта )Действий (public-методов,

вызываемых в точках внедрения внутри целевого приложения)

Правил внедрения (Определяют набор точек внедрения)

Аспект – это класс, методы которого аннотированы атрибутами АОП для их внедрения

(C) Сафонов В.О. 2012

Aspect.NET ML – метаязык АОП

Аспекты специфицируются на простом метаязыке – Aspect.NET.ML.

Метаязык позволяет описать множество желаемых точек внедрения. Правила внедрения могут быть также описаны отдельно от аспекта и использоваться многими аспектами (rule sets)Затем специальный конвертор транслирует конструкции метаязыка в определения атрибутов на языке реализации аспекта. АОП- аннотации представляются в виде custom- атрибутовПолученный исходный код аспекта на языке

реализации (например, C#) транслируется в сборку штатным компилятором .NET Framework

(C) Сафонов В.О. 2012

%aspect Test

//ML language

 

public class Test

 

{

 

 

%modules

 

Aspect.ML

private static void TestRun()

{

 

Converter

WriteLine(”test”);

 

}

%rules

public class Test: Aspect//Attribute annotation

{

[AspectAction(“%before %call Write*")] public static void TestRunAction()

{

Test.TestRun();

}

}

}

Aspect Library

(DLL)

C# Compiler

(C) Сафонов В.О. 2012

Aspect.NET ML - пример

%aspect Politeness public class Politeness

{%modules

private static void SayScanningHello()

{

Console.WriteLine("Welcome to Aspect.NET scanning }system!");

%rules

%before %call *SomeMethod

%action public static void SayScanningHelloAction() {} Politeness.SayScanningHello();

}// Politeness

(C) Сафонов В.О. 2012

Аспект в терминах custom-атрибутов (пример)

public class Politeness: Aspect

{

private static void SayScanningHello()

{

Console.WriteLine("Welcome to Aspect.NET scanning system!");

}

[AspectAction(“%before %call *SomeMethod”)] public static void SayScanningHelloAction()

{

Politeness.SayScanningHello();

}

}// Politeness

(C) Сафонов В.О. 2012

Возможности Aspect.NET ML (1/3)

Может специфицировать вставку деййствий аспекта перед, после или вместо вызова метода в целевом приложенииДействия аспекта имеют полный доступ к контексту

точки внедрения в посощью свойств базового класса

Aspect:

\\this keyword

Object This;

Object TargetObject;

\\p.TargetMethod(..);

MemberInfo TargetMemberInfo; \\TargetMethod as

MethodInfo

Type WithinType;

\\this.GetType();

MethodBase WithinMethod; \\this.CurrentMethod();

string SourceFilePath;

\\*.cs filepath

string SourceFileLine. \\source line number

(C)Сафонов В.О. 2012

Возможности Aspect.NET ML (2/3)

Правила внедрения используют маски и регулярные выражения:

%before %call Namespace.Class.MethodName или:

%before %call *MethodNameФильтрация сигнатуры целевого метода:

%instead %call static public void *Method(float, string, ..)

(C) Сафонов В.О. 2012

Console.WriteLine({0}, i);

Возможности Aspect.NET ML (3/3)

Захват аргументов целевого метода: AspectAction(“%after %call *Method(int) && args(arg[1])”)

static public void MethodAction(int i)

{

}

Дополнительные ограничения на точки внедрения, сужающие пространство их поиска:

%within(*SomeType)

%withincode(*SomeMethod)

%instead %call *Method && %within(*MyType) && %!withincode(*.ctor)

(C) Сафонов В.О. 2012

Архитектура Aspect.NET

User

 

Aspect.NET

 

 

Framework

 

Aspect

Aspect.NET.M

 

L

Aspect

Source Code

Converter

Library

 

 

Weaver

Application

Compiler

Applicatio

Source Code

 

 

n

 

(C) Сафонов В.О. 2012

Applicatio

n

Примеры внедрения

Целевое приложение – система BankManagement (управление банком):

static void Main(string[] args)

{

BankAccount acc1 = new BankAccount(); acc1.deposit(20);//apply aspects here acc1.withdraw(20);//apply aspects here

}

BankAccountContractAspect – применение Design by Contract: проверки инварианта, пред- и постусловий

BankManagement.Deposit() и

BankManagement.withdraw();UsageLicensingAspect – проверка полномочности выполнения банковской транзакции на конкретной машине конкретным пользователем.

(C) Сафонов В.О. 2012

Соседние файлы в папке Safonov