DEV010
Programação Orientada a
Aspectos em .NET
Tiago Dias
[email protected]
Software Architect, BRISA
Patrocinadores
Agenda
I - Introdução à Programação Orientada a
Aspectos (AOP)
II - Ferramentas AOP para .NET
III - AOP multi-dimensional: MDSoC
O software está a ficar
confundido…
Porquê a confusão?
“Bolas, nós faríamos melhor...”
Sim, mas se o software não misturasse tantos
requisitos
Software com muitos requisitos
Use cases simples deixam de ter os
resultados esperados
Novas funcionalidades que deviam ser
transparentes afectam funcionalidades
existentes
As funcionalidades, os assuntos, não estão
a ser separados no código!!
Separation of Concerns (SoC)
Concerns – assuntos, correspondem a:
Requisitos – Funcionais e Não Funcionais (NFR)
É o objectivo de:
Programação orientada aos objectos (OOP)
Modularização
Encapsulamento
Arquitectura orientadas aos Serviços (SOA)
Vários design patterns
Mas não são suficientes...
A programação orientada a aspectos (AOP)
vair pegar onde estas abordagens ficaram
AOP – Exemplo
Código emaranhado
Código espalhado
Requisitos funcionais:
Alimentação
Descanso
Procriar
Ser fêmea ou macho
Animal
Mamífero
Requisitos não funcionais
Tigre
Foca
OOP
Logging
Segurança
Audit
Cross-cutting concerns
AOP – Exemplo (2)
Factorização em aspectos:
Alimentação
Animal
Descanso
Procriar
Mamífero
Ser fêmea ou macho
Tigre
Foca
Logging
Segurança
OOP
Audit
Anatomia de um aspecto
Logging
Advice
Pointcuts
Prociar
Tigre
Joint-points
Pointcuts
public class Logging
{
[AroundBody("Tigre::*()]")]
public static object Log(MethodJoinPoint jp)
{
Debug.WriteLine("...");
object result = jp.Proceed();
Debug.WriteLine("...");
return result;
}
}
Advice
public class Tigre : Mamifero
public class Procriar
{
Pointcut { [Insert("Tigre")]
public void Rosnar()
{
public void Cortejar(Tigre femea)
base.EmiteSom("Roaarrr");
{
}
if(this.Femea || !femea.Femea)
}
public void Estender()
{
foreach(ParteDoCorpo pc
in this.partesDoCorpo)
pc.Estender();
}
}
}
...
throw Exception("...");
Advice
Joint-points
Exemplo utilizando o
Como são aplicados os
aspectos?
Weaving:
Código OO + Aspectos => Código em execução
Tigre
Tigre
Quando e como é feito é o principal
diferenciador entre as ferramentas AOP
AOP - Finalidades/Cenários
Separation of Concerns (SoC)
Alterações dinâmicas sem parar software
de produção
Permitir testar componentes onde é díficil
utilizar Mocks
...
II - Ferramentas AOP para .NET
Mapa Mundo AOP
Tipificação das ferramentas
DEMO: AspectDNG
As soluções AOP e a Microsoft
Mapa AOP
AspectJ™
PROSE
Axon
JAsCo
Nanning
DynAOP JMangler
Steamloom EAOP
JAML CeaserJ
Jiazzi
JAC
Arachne
TinyC2 AspectC
AspectC++
FeatureC++
XWeaver
IBM
BEA
WebSphere JRockit
HyperProbes JVM
JBoss
(J2EE)
Java
Eclipse Products
SiteVision
Jakarta
Hivemind Spring
(J2EE)
C++
.NET
Phx.Morph
Wicca Rapier.NET
Aspect#
AspectDNG Loom.NET
Weave.NET Wool Meta.NET
JAsCo.NET
Eos Aspect.NET
Aspects
AspectS
PostSharp
Hyper/J
SetPoint CLAW
AOPHP
Compose*
Apostle
Poly
Hyper/Net
SourceWeave.NET
AspectCOOL
PHPaspect
DemeterJ
AopDotN AOP.NET
Pythius PEAK
etAddin
Encase
Composition
AspectScheme
AspectL
AOP-Engine
Filters
AspectCocoa
Concern
AspectR
Manipulation
Environment
Other
Itálico = patrocínio Microsoft (mas não são produtos)
Slide adaptado de apresentação sobre o Wicca
Tipificação das ferramentas
AOP
Modelo de compilação e execução .NET:
Compilação
Código
Fonte
Compilador
Execução
MSIL
Compilador JIT
Ad-hoc compiler:
Compilação
Código
Fonte
Compilador
MSIL
Aspectualizado
Aspectos
É a abordagem do AspectJ (Java)
NKalore
http://aspectsharpcomp.sourceforge.net/
Alteração do Mono C# Compiler
Código
Nativo
Ferramentas AOP (2)
Ad-hoc Virtual Machine
Execução
MSIL
Compilador JIT
Código
Nativo
Aspectualizado
Aspectos
Agora viabilizada através do MS Phoenix
Poderá ser a melhor de todas as abordagens:
Dinâmica
Performant
Transparente
Implementação mais próxima (funciona
apenas em modo Debug):
Ferramentas AOP (3)
Ad-hoc Virtual Machine
Utiliza o Microsoft Phoenix
E tem como objectivo
http://www1.cs.columbia.edu/~eaddy/wicc
a
testar AOP num projecto
de grande escala: MS Phoenix
Actua no compilador JIT por intermédio do:
Microsoft Debugger Edit&Continue (.NET 2.0)
Também permite outras abordagens (ex. IL
Instrumentation)
Suporta weaving baseado em atributos
Ferramentas AOP (4)
Source-to-source
Compilação
Código
Fonte
Weaver
Código fonte
Aspectualizado
Aspectos
O weaving ocorre na Pré-compilação
A única abordagem em que é possível ver o
código weaved
Paradigma AOP alargado: Multi-dimensional
Separation of Concers - MDSoC
Utiliza o NRefactory, um parser de C# e
VB.Net do SharpDevelop 2.0
Ferramentas AOP (5)
IL Instrumentation
MSIL
Weaver
MSIL
Aspectualizado
Aspectos
Suportam qualquer linguagem compilável
em MSIL
Permitem a aspectualização de software sem
o código fonte
Ferramentas AOP (6)
IL Instrumentation
DEMO
Compose*
http://aspectdng.sourceforge.net
http://composestar.sourceforge.net
Os pointcuts podem usar XPath
Paradigma AOP:
Filtros de composição
http://www.postsharp.org/
LAOS – Lightweight A. O. System
http://setpoint.codehaus.org/
Aspect.NET
http://www.academicresourcecenter.net/curriculu
m/pfv.aspx?ID=6595
Suporte parcial da MS Research
Integração no Visual Studio
Pointcuts semânticos
Suporte parcial da MS Research
Ferramentas AOP (7)
IL Instrumentation
http://dotspect.tigris.org/
http://www.dsg.cs.tcd.ie/dynamic/?category_id=-26
Utiliza o RAIL para processar MSIL
DotNetAOP
Gripper-LOOM.NET
http://www.gotdotnet.com/workspaces/workspace.a
spx?id=1b78f7c1-895f-49a7-8fa6-1565db16d41b
http://www.dcl.hpi.unipotsdam.de/research/loom/gripper_loom.htm
NAop / AOP.NET
http://sourceforge.net/projects/aopnet/
Ferramentas AOP (8)
Factory Based Proxying
Compilação
Código fonte
Aspectualizado
Compilador
Necessário utilizar proxies (não transparente)
Tipicamente limitadas a uma só linguagem
http://www.castleproject.org/
aspectsharp
http://www.springframework.net
NAspect
http://www.puzzleframework.com
http://s2container.net.seasar.org/en
/index.html
Frameworks
Rapier-LOOM.NET
http://www.dcl.hpi.unipotsdam.de/research/loom/rapier_loom.htm
http://www.typemock.com
Os objectos são estendidos com funcionalidades
necessárias para a testabilidade através de proxies.
AspectDNG
Adicionar logging a todos os métodos
de uma aplicação
As soluções AOP e a
Microsoft
Enterprise Library e AOP
A EntLib
Uma solução AOP sobre a EntLib
MS Research Phoenix
O que é o Phoenix?
Soluções AOP suportadas sobre o Phoenix
Enterprise Library
Framework de requisitos não funcionais
(NFR framework)
Cada tipo de requisito não funcional existe sob
a forma de um Application Block:
Configuração, Segurança, Tratamento de
Excepções, Caching, Acesso a Dados e Validação
Utiliza intensivamente design patterns:
Factory
Provider
Strategy
Façade
Enterprise Library:
Application Blocks = Aspectos?
Será possível considerar os Application
Blocks como aspectos pré-criados
preparados para weaving?
NÃO
Oferecem a sua funcionalidade através de Factories e
outros Design Patterns que não são tão transparentes
como os Aspectos
É sempre necessário alterar o funcionamento do código
onde se aplicam
Contudo
Têm objectivos comuns aos da AOP (tal como os
design patterns)
Enterprise Library: Caching
Código não operacional
// Get the CacheManager
CacheManager myCacheManager = CacheFactory.GetCacheManager();
// Save the settings to the Cache
myCacheManager.Add("SiteSettings", mySettings);
Factory Pattern
// Retrieve settings from the cache
SiteSettings cachedSettings =
(SiteSettings)myCacheManager.GetData("SiteSettings");
if (cachedSettings != null)
{
Console.WriteLine("Name = {0}", cachedSettings.Name);
Console.WriteLine("Url = {0}", cachedSettings.Url);
Console.WriteLine("Email Address = {0}", cachedSettings.EmailAddress);
Console.ReadLine();
}
Código operacional
Enterprise Library: Validation
public class Customer
{
[NotNullValidator]
[StringLengthValidator(1, 100)]
public string Name
{
get { return name; }
set { name = value; }
}
Attribute based
[NotNullValidator]
public string Email
{
get { return email; }
set { email = value; }
}
Façade Pattern
public string ValidateCustomer()
{
ValidationResults results = Validation.Validate(this);
string message = string.Empty;
if (!results.IsValid) ...
}
}
Enterprise Library: Exception
Handling
try
{
int i = 5;
int j = 0;
int z = i / j;
}
catch(Exception ex)
{
bool rethrow =
Similar to Aspect Advice declaration
ExceptionPolicy.HandleException(ex, "Business Layer Policy");
if (rethrow)
{
throw;
}
}
Uma solução AOP sobre a
EntLib
Solução de Olaf Conijn proposta no seu blog:
http://bloggingabout.net/blogs/olaf/
Baseada num CTP da EntLib 2.0
Não é compatível com a versão final da
framework .NET 2.0 (erros runtime)
Utiliza estratégia de Factory Based-Proxying
AOP com a EntLib: Exemplo
Criar um espremedor de sumo (juicer)
Espremer 10 unidades
O espremedor e o fruto a espremer são
definidos em configuração
static void Main(string[] args
{
string containerName = "MyContainer";
Obtém um container (config)
IServiceContainer container =
ContainerFactory.CreateServiceContainer(containerName);
IJuicer juicer =
(IJuicer)container.GetServiceInstance(typeof(IJuicer));
juicer.Juice(10);
Console.WriteLine(juicer.CollectedJuice);
}
Fabrica um juicer
AOP com a EntLib: Exemplo (2)
AOP com a EntLib: Exemplo (3)
public class GenericMethodTracerAdvice: IAdvice
{
public object Invoke(IMethodInvocation invocation)
{
string traceMessage = string.Format(
"type: {0} method: {1}; parameters: {2}",
invocation.MethodCall.MethodBase.DeclaringType.Name,
invocation.MethodCall.MethodName,
invocation.MethodCall.MethodSignature);
Debug.WriteLine(string.Format("BEFORE[{0}]", traceMessage));
object result = invocation.ProceedInvocation();
Debug.WriteLine(string.Format("AFTER[{0}]", traceMessage));
return result;
}
}


Invoca o método original.
Pode ser omitido, criando um Advice do tipo Instead of
Microsoft Phoenix
O Microsoft Phoenix será o backend de uma
futura geração de compiladores e ferramentas
de linguagens da Microsoft
Em desenvolvimento (Microsoft Research)
1.8M linhas de código – 318K à mão
Permite a manipulação de programas ao nível
de uma representação intermédia (IR), ex. IL
Oferece APIs para criação de plug-ins e
ferramentas para diversas fases da
compilação e runtime - extensão e criação:
De compiladores e compiladores JIT
De ferramentas que manipulam a AST (ex.
Intellisense) ou a IL
Microsoft Phoenix (2)
Viabiliza conjunto alargado de soluções AOP
Ad-hoc compiler
Plug-ins para o compilador que utilizam a AST para
aplicar advice ou criar joint points dinâmicos (hooks)
IL instrumentation
Semelhante ao anterior mas através de uma ferramenta
de pós-processamento (carrega DLLs)
Ad-hoc VM
Através da extensão do Compilador JIT
O compilador JIT passa a aplicar advice dinamicamente
Os pointcuts são avaliados em runtime
É possível alterar pointcuts e advice
A fase de weaving deixa de ser necessária
Microsoft Phoenix (3)
O Phoenix está já a ser utilizado (num
release RDK):
Aspect Mining – detecção de código clonado
Mais info: http://www.cis.uab.edu/tairasr/phoenix/
Para a manipulação do código intermédio
(MSIL):
Aspect.NET
SetPoint AOP
Meta.NET
Wicca
III - AOP multi-dimensional
MDSoC
MDSoC – Multi-dimensional separation of
concerns
DEMO – MDSoC com Partial Types
DEMO – Hyper/Net
MDSoC – Multi-Dimensional
Separation of Concerns
Transformação num hiper-espaço:
Audit
Alimentação
Logging
Descanso
Procriar
Ser fêmea ou macho
Animal
Segurança
Mamífero
Ontologia
Tigre
Foca
OOP
MDSoC – Multi-dimensional
separation of concerns (2)
Desenvolvida desde 1999 por Peri Tarr e Harold
Ossher
Implementação Java: Hyper/J
Pós-compilador - funciona de modo análogo à
abordagem IL Instrumentation em .NET
Algumas ferramentas de aspectos .NET têm
liberdade sintáctica para suportar MDSoC (ex.
AspectDNG)
Nós pensamos em MDSoC :
“The thoughts perfectly slot themselves into the
rows, columns, layers, hyper-rows, hyper-columns,
and hyper-layers of a vast matrix.” Steven Pinker
MDSoC c/ Partial Types
Ferramentas MDSoC
Hyper/J – Java
Hyper VB.Net
??
Hyper C#
Limitado a trabalhar com uma só classe numa
GUI específica 
Hyper/Net
(Beyond Partial Types)
Sumário
AOP
Tem várias vantagens práticas
Existem implementações aceitáveis para testes e
projectos não críticos (esses existem?)
É uma área em maturação
MDSoC
Todos devíamos usar através dos partial types do
.NET
Existe poucas ferramentas para ir além dos partial
types
É uma área cujo potencial completo está muito
pouco explorado
Recursos AOP e MDSoC
Aspect Oriented Software
Development
http://AOSD.net (Wiki)
A minha página pessoal
Artigo Hyper/Net
http://ptsoft.net/tdd/
[email protected]
Pergunte aos Especialistas
Obtenha Respostas às Suas Questões
Depois da apresentação:
Área de Desenvolvimento
Questionário de Avaliação
Passatempo!
Complete o questionário de
avaliação e devolva-o no balcão
da recepção.
Habilite-se a ganhar uma Xbox
360 por dia!
DEV010
Programação Orientada a Aspectos
em .NET
© 2007 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.
Download

Slide 1 - ptsoft.net