- •Архитектуры и модели программ и знаний
- •Аспектно-ориентированное программирование (АОП)
- •Аспектно-ориентированное программирование:
- •Структура определения аспекта (Aspect.NET)
- •Аспекты – статические или динамические?
- •Аспекты в AspectJ (1/2)
- •Аспекты в AspectJ (2/2)
- •Аспекты в Aspect.NET
- •Подходы к АОП
- •Цели Aspect.NET
- •Aspect.NET - Обзор
- •Aspect.NET ML – метаязык АОП
- •%aspect Test
- •Aspect.NET ML - пример
- •Аспект в терминах custom-атрибутов (пример)
- •Возможности Aspect.NET ML (1/3)
- •Возможности Aspect.NET ML (2/3)
- •Возможности Aspect.NET ML (3/3)
- •Архитектура Aspect.NET
- •Примеры внедрения
- •Диаграмма классов
- •Фильтрация точек внедрения
- •Декомпилированные результаты внедрения
- •Microsoft Phoenix (http://connect.microsoft.com /phoenix)
- •Проблемы АОП и их решения в Aspect.NET
- •Литература по АОП
- •Вопросы и домашнее задание к лекции 7
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
Возможности 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
