dev010 programação orientada a aspectos em.net tiago dias [email protected] software architect,...
TRANSCRIPT
DEV010DEV010
Programação Orientada a Programação Orientada a Aspectos em .NET Aspectos em .NET
Tiago DiasTiago [email protected]@ptsoft.netSoftware ArchitectSoftware Architect, BRISA, BRISA
Tiago DiasTiago [email protected]@ptsoft.netSoftware ArchitectSoftware Architect, BRISA, BRISA
PatrocinadoresPatrocinadores
AgendaAgenda
I - Introdução à Programação Orientada a I - Introdução à Programação Orientada a Aspectos (AOP)Aspectos (AOP)
II - Ferramentas AOP para .NETII - Ferramentas AOP para .NET
III - AOP multi-dimensional: MDSoCIII - AOP multi-dimensional: MDSoC
O software está a ficar O software está a ficar confundido…confundido…
Porquê a confusão?Porquê a confusão?
““Bolas, nós faríamos melhor...”Bolas, nós faríamos melhor...”Sim, mas se o Sim, mas se o software software não misturasse tantos não misturasse tantos requisitosrequisitos
SoftwareSoftware com com muitos requisitosmuitos requisitosUse casesUse cases simples simples deixam de ter os deixam de ter os resultados esperadosresultados esperados
Novas funcionalidadesNovas funcionalidades que deviam ser que deviam ser transparentes transparentes afectam funcionalidades afectam funcionalidades existentesexistentes
As As funcionalidadesfuncionalidades, os , os assuntosassuntos, , não estão não estão a ser separadosa ser separados no código!! no código!!
Separation of Concerns (SoC)Separation of Concerns (SoC)
ConcernsConcerns – – assuntosassuntos, correspondem a:, correspondem a:Requisitos – Funcionais Requisitos – Funcionais e e Não Funcionais (NFR)Não Funcionais (NFR)
É o objectivo de:É o objectivo de:Programação orientada aos objectos (Programação orientada aos objectos (OOPOOP))
ModularizaçãoModularização
EncapsulamentoEncapsulamento
Arquitectura orientadas aos Serviços (Arquitectura orientadas aos Serviços (SOASOA))
Vários Vários design patternsdesign patterns
Mas não são suficientes...Mas não são suficientes...
A A programação orientada a aspectosprogramação orientada a aspectos ( (AOPAOP) ) vair pegar onde estas abordagens ficaramvair pegar onde estas abordagens ficaram
Cross-cutting concerns
AOP – ExemploAOP – Exemplo
Requisitos funcionais:Requisitos funcionais:AlimentaçãoAlimentação
DescansoDescanso
ProcriarProcriar
Ser fêmea ou machoSer fêmea ou macho
Requisitos não funcionaisRequisitos não funcionaisLoggingLogging
SegurançaSegurança
AuditAudit
TigreTigre
AnimalAnimal
MamíferoMamífero
FocaFoca
OOP
Código emaranhado
Código espalhado
AOP – Exemplo (2)AOP – Exemplo (2)
Factorização em aspectos:Factorização em aspectos:
AlimentaçãoAlimentação
DescansoDescanso
ProcriarProcriar
Ser fêmea ou machoSer fêmea ou macho
LoggingLogging
SegurançaSegurança
AuditAudit
TigreTigre
AnimalAnimal
MamíferoMamífero
FocaFoca
OOP
Anatomia de um aspectoAnatomia de um aspecto
TigreTigre
PointcutsPointcutsAdviceAdvice
Joint-pointsJoint-points
public class Tigre : Mamifero{ public void Rosnar() { base.EmiteSom("Roaarrr"); }
public void Estender() { foreach(ParteDoCorpo pc
in this.partesDoCorpo) pc.Estender(); }}
Joint-pointsJoint-points
LoggingLogging
ProciarProciarpublic class Logging{ [AroundBody("Tigre::*()]")] public static object Log(MethodJoinPoint jp) { Debug.WriteLine("..."); object result = jp.Proceed(); Debug.WriteLine("..."); return result; }}
Exemplo utilizando o
public class Procriar{ [Insert("Tigre")] public void Cortejar(Tigre femea) { if(this.Femea || !femea.Femea)
throw Exception("...");...
}}
PointcutsPointcutsAdviceAdvice
AdviceAdvice
PointcutPointcut
Como são aplicados os Como são aplicados os aspectos?aspectos?
WeavingWeaving::
Quando e como é feito é o principal Quando e como é feito é o principal diferenciadordiferenciador entre as ferramentas AOP entre as ferramentas AOP
TigreTigreTigreTigre
Código OOCódigo OO + Aspectos+ Aspectos => Código em execução=> Código em execução
AOP - Finalidades/CenáriosAOP - Finalidades/Cenários
Separation of Concerns (Separation of Concerns (SoCSoC))
Alterações dinâmicasAlterações dinâmicas sem parar sem parar softwaresoftware de produçãode produção
Permitir Permitir testartestar componentes onde é díficil componentes onde é díficil utilizar utilizar MocksMocks
......
II - Ferramentas AOP para .NETII - Ferramentas AOP para .NET
Mapa Mundo AOPMapa Mundo AOP
TipificaçãoTipificação das ferramentas das ferramentas
DEMO: AspectDNGDEMO: AspectDNG
As soluções AOP e a As soluções AOP e a MicrosoftMicrosoft
AspectJ™
PROSE
Hyper/J
JAsCo
EAOP
JMangler
AspectC++
CeaserJ
AspectC
Steamloom
AspectS
FeatureC++
DynAOP
Apostle
AspectR
Spring (J2EE)
DemeterJ
Concern Manipulation Environment
Eclipse
IBM WebSphere
HyperProbes
JBoss (J2EE)
BEA JRockit
JVM
AspectScheme
Aspects
AOPHP
Composition Filters
Jakarta Hivemind
JAML
XWeaver
PEAKPythiusPHPaspect
AspectL
AspectCocoa
Loom.NET
Weave.NET Meta.NET
Rapier.NETAspect#
Aspect.NET
AspectDNG
SetPoint CLAWPostSharp
Eos
Compose*
EncaseAOP-Engine
SourceWeave.NETAopDotNetAddin
Phx.Morph
OtherOther
Java
C++.NET
ProductsProducts
Itálico = patrocínio Microsoft (mas não são produtos)Itálico = patrocínio Microsoft (mas não são produtos)
AOP.NET
Wool
AspectCOOL
JAC
Nanning
JAsCo.NET
SiteVision
Axon
Arachne
Jiazzi
Poly
TinyC2 Wicca
Mapa AOPMapa AOP
Slide adaptado de apresentação sobre o Slide adaptado de apresentação sobre o WiccaWicca
Hyper/Net
Tipificação das ferramentas Tipificação das ferramentas AOPAOP
Modelo de compilação e execução .NET:Modelo de compilação e execução .NET:
Ad-hoc compiler:Ad-hoc compiler:
É a abordagem do É a abordagem do AspectJAspectJ (Java) (Java)
NKaloreNKalorehttp://aspectsharpcomp.sourceforge.net/http://aspectsharpcomp.sourceforge.net/
Alteração do Alteração do Mono C# CompilerMono C# Compiler
CódigoCódigoFonteFonte CompiladorCompiladorCompiladorCompilador
CompilaçãoCompilação
AspectosAspectos
MSILMSILAspectualizadoAspectualizado
CódigoCódigoFonteFonte MSILMSIL CódigoCódigo
NativoNativoCompiladorCompiladorCompiladorCompilador Compilador JITCompilador JITCompilador JITCompilador JIT
CompilaçãoCompilação ExecuçãoExecução
Ferramentas AOP (2)Ferramentas AOP (2)Ad-hoc Virtual MachineAd-hoc Virtual Machine
Agora viabilizada através do Agora viabilizada através do MS PhoenixMS Phoenix
Poderá ser a melhor de todas as abordagens:Poderá ser a melhor de todas as abordagens:DinâmicaDinâmica
PerformantPerformant
TransparenteTransparente
Implementação mais próxima (funciona Implementação mais próxima (funciona apenas em modo Debug):apenas em modo Debug):
MSILMSILCódigoCódigoNativoNativo
AspectualizadoAspectualizadoCompilador JITCompilador JITCompilador JITCompilador JITExecuçãoExecução
AspectosAspectos
Ferramentas AOP (3)Ferramentas AOP (3)Ad-hoc Virtual MachineAd-hoc Virtual Machine
Utiliza o Microsoft PhoenixUtiliza o Microsoft Phoenix
E tem como objectivoE tem como objectivotestar AOPtestar AOP num projecto num projectode grande escala: MS Phoenixde grande escala: MS Phoenix
Actua no compilador JIT por intermédio do:Actua no compilador JIT por intermédio do:Microsoft Debugger Edit&Continue (.NET 2.0)Microsoft Debugger Edit&Continue (.NET 2.0)
Também permite outras abordagens (ex. Também permite outras abordagens (ex. IL IL InstrumentationInstrumentation))
Suporta Suporta weavingweaving baseado em baseado em atributosatributos
http://www1.cs.columbia.edu/~eaddy/http://www1.cs.columbia.edu/~eaddy/wiccawicca
Ferramentas AOP (4)Ferramentas AOP (4)Source-to-sourceSource-to-source
O O weavingweaving ocorre na ocorre na Pré-compilaçãoPré-compilação
A única abordagem em que é possível ver o A única abordagem em que é possível ver o código código weavedweaved
Paradigma AOP alargado: Multi-dimensional Paradigma AOP alargado: Multi-dimensional Separation of Concers - Separation of Concers - MDSoCMDSoC
Utiliza o NRefactory, um parser de C# e Utiliza o NRefactory, um parser de C# e VB.Net do SharpDevelop 2.0VB.Net do SharpDevelop 2.0
CódigoCódigoFonteFonte WeaverWeaverWeaverWeaver
CompilaçãoCompilação
AspectosAspectos
Código fonteCódigo fonteAspectualizadoAspectualizado
Ferramentas AOP (5)Ferramentas AOP (5)IL InstrumentationIL Instrumentation
Suportam Suportam qualquer linguagemqualquer linguagem compilável compilável em MSILem MSIL
Permitem a aspectualização de Permitem a aspectualização de softwaresoftware sem sem o código fonteo código fonte
MSILMSIL WeaverWeaverWeaverWeaver
AspectosAspectos
MSILMSILAspectualizadoAspectualizado
Ferramentas AOP (Ferramentas AOP (66))IL InstrumentationIL Instrumentation
Compose*Compose*http://composestar.sourceforge.nethttp://composestar.sourceforge.net
Paradigma AOP:Paradigma AOP:Filtros de composiçãoFiltros de composição
http://setpoint.codehaus.org/http://setpoint.codehaus.org/
Pointcuts semânticosPointcuts semânticos
Suporte parcial da MS ResearchSuporte parcial da MS Research
http://aspectdng.sourceforge.nethttp://aspectdng.sourceforge.net
Os Os pointcutspointcuts podem usar podem usar XPathXPath
http://www.postsharp.org/http://www.postsharp.org/
LAOS – Lightweight A. O. SystemLAOS – Lightweight A. O. System
Aspect.NETAspect.NEThttp://www.academicresourcecenter.net/http://www.academicresourcecenter.net/curriculum/pfv.aspx?ID=6595curriculum/pfv.aspx?ID=6595
Suporte parcial da MS ResearchSuporte parcial da MS Research
Integração no Integração no Visual StudioVisual Studio
DEMO
Ferramentas AOP (Ferramentas AOP (77))IL InstrumentationIL Instrumentation
http://dotspect.tigris.org/http://dotspect.tigris.org/
Utiliza o RAIL para processar MSILUtiliza o RAIL para processar MSILhttp://www.dsg.cs.tcd.ie/dynamic/?category_id=-26http://www.dsg.cs.tcd.ie/dynamic/?category_id=-26
DotNetAOPDotNetAOPhttp://www.gotdotnet.com/workspaces/http://www.gotdotnet.com/workspaces/
workspace.aspx?id=1b78f7c1-895f-49a7-8fa6-workspace.aspx?id=1b78f7c1-895f-49a7-8fa6-1565db16d41b1565db16d41b
NAop / AOP.NETNAop / AOP.NEThttp://sourceforge.net/projects/aopnet/http://sourceforge.net/projects/aopnet/
Gripper-LOOM.NETGripper-LOOM.NEThttp://www.dcl.hpi.uni-potsdam.de/research/loom/http://www.dcl.hpi.uni-potsdam.de/research/loom/
gripper_loom.htmgripper_loom.htm
Ferramentas AOP (Ferramentas AOP (88))Factory Based ProxyingFactory Based Proxying
Necessário utilizar Necessário utilizar proxiesproxies (não transparente)(não transparente)
Tipicamente limitadas a Tipicamente limitadas a uma só linguagemuma só linguagem
CompiladorCompiladorCompiladorCompiladorCompilaçãoCompilação
Código fonteCódigo fonteAspectualizadoAspectualizado
http://www.castleproject.org/http://www.castleproject.org/aspectsharpaspectsharp
http://www.springframework.nethttp://www.springframework.net http://s2container.net.seasar.org/http://s2container.net.seasar.org/en/index.htmlen/index.html
NAspecthttp://www.puzzleframework.comhttp://www.puzzleframework.com FrameworksFrameworks
Rapier-LOOM.NETRapier-LOOM.NEThttp://www.typemock.comhttp://www.typemock.com
Os objectos são estendidos com funcionalidades Os objectos são estendidos com funcionalidades necessárias para a testabilidade através de necessárias para a testabilidade através de proxiesproxies..
http://www.dcl.hpi.uni-potsdam.de/research/http://www.dcl.hpi.uni-potsdam.de/research/loom/rapier_loom.htmloom/rapier_loom.htm
AspectDNGAspectDNG
Adicionar Adicionar logginglogging a todos os métodos a todos os métodos de uma aplicaçãode uma aplicação
As soluções AOP e a As soluções AOP e a MicrosoftMicrosoft
Enterprise LibraryEnterprise Library e AOP e AOPA EntLibA EntLib
Uma Uma solução AOPsolução AOP sobre a EntLib sobre a EntLib
MS Research MS Research PhoenixPhoenixO que é o Phoenix?O que é o Phoenix?
Soluções AOP Soluções AOP suportadassuportadas sobre o sobre o PhoenixPhoenix
Enterprise LibraryEnterprise Library
FrameworkFramework de de requisitos não funcionaisrequisitos não funcionais (NFR framework)(NFR framework)
Cada tipo de requisito não funcional existe sob Cada tipo de requisito não funcional existe sob a forma de um a forma de um Application BlockApplication Block::
Configuração, Segurança, Tratamento de Configuração, Segurança, Tratamento de Excepções, Excepções, CachingCaching, Acesso a Dados e Validação, Acesso a Dados e Validação
Utiliza intensivamente Utiliza intensivamente design patternsdesign patterns::FactoryFactory
ProviderProvider
StrategyStrategy
FaçadeFaçade
Enterprise Library: Enterprise Library: Application BlocksApplication Blocks = Aspectos? = Aspectos?
Será possível considerar os Será possível considerar os Application Application BlocksBlocks como como aspectos pré-criadosaspectos pré-criados preparados para preparados para weavingweaving??
NÃONÃOOferecem a sua funcionalidade através de Oferecem a sua funcionalidade através de FactoriesFactories e e outros outros Design Patterns Design Patterns que que não sãonão são tão tão transparentestransparentes como os Aspectoscomo os Aspectos
É sempre necessário É sempre necessário alteraralterar o funcionamento do o funcionamento do código código onde se aplicamonde se aplicam
ContudoContudoTêm Têm objectivos comunsobjectivos comuns aos da aos da AOPAOP (tal como os (tal como os design patternsdesign patterns))
// Get the CacheManagerCacheManager myCacheManager = CacheFactory.GetCacheManager();
// Save the settings to the CachemyCacheManager.Add("SiteSettings", mySettings);
// Retrieve settings from the cacheSiteSettings 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();}
Enterprise Library: Enterprise Library: CachingCaching
Factory Pattern
Código operacional
Código não operacional
Enterprise Library: Enterprise Library: ValidationValidationpublic class Customer{ [NotNullValidator] [StringLengthValidator(1, 100)] public string Name { get { return name; } set { name = value; } }
[NotNullValidator] public string Email { get { return email; } set { email = value; } }
public string ValidateCustomer() { ValidationResults results = Validation.Validate(this); string message = string.Empty;
if (!results.IsValid) ... } }
Façade Pattern
Attribute based
Enterprise Library: Enterprise Library: Exception Exception HandlingHandlingtry{ int i = 5; int j = 0; int z = i / j;}catch(Exception ex){ bool rethrow = ExceptionPolicy.HandleException(ex, "Business Layer Policy"); if (rethrow) { throw; }}
Similar to Aspect Advice declaration
Uma solução AOP sobre a Uma solução AOP sobre a EntLibEntLib
Solução de Solução de Olaf ConijnOlaf Conijn proposta no seu proposta no seu blogblog::http://bloggingabout.net/blogs/olaf/http://bloggingabout.net/blogs/olaf/
Baseada num CTP da Baseada num CTP da EntLib 2.0EntLib 2.0
Não é compatível com a versão final da Não é compatível com a versão final da framework .NET 2.0 (erros framework .NET 2.0 (erros runtimeruntime))
Utiliza estratégia de Utiliza estratégia de Factory Based-ProxyingFactory Based-Proxying
AOP com a EntLib: AOP com a EntLib: ExemploExemplo
Criar um espremedor de sumo (Criar um espremedor de sumo (juicerjuicer))
EspremerEspremer 10 unidades 10 unidades
O espremedor e o fruto a espremer são O espremedor e o fruto a espremer são definidos em definidos em configuraçãoconfiguração
static void Main(string[] args{ string containerName = "MyContainer";
IServiceContainer container = ContainerFactory.CreateServiceContainer(containerName);
IJuicer juicer = (IJuicer)container.GetServiceInstance(typeof(IJuicer));
juicer.Juice(10);
Console.WriteLine(juicer.CollectedJuice);}
Fabrica um juicer
Obtém um container (config)
AOP com a EntLib: AOP com a EntLib: Exemplo (2)Exemplo (2)
AOP com a EntLib:AOP com a EntLib: Exemplo (3) 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 PhoenixMicrosoft Phoenix
O O Microsoft PhoenixMicrosoft Phoenix será o será o backend backend de uma de uma futura geração de futura geração de compiladorescompiladores e ferramentas e ferramentas de linguagens da de linguagens da MicrosoftMicrosoftEm Em desenvolvimentodesenvolvimento ( (Microsoft ResearchMicrosoft Research))1.8M linhas de código – 318K à mão1.8M linhas de código – 318K à mãoPermite a manipulação de programas ao nível Permite a manipulação de programas ao nível de uma de uma representação intermédiarepresentação intermédia (IR), ex. IL (IR), ex. IL Oferece Oferece APIsAPIs para criação de plug-ins e para criação de plug-ins e ferramentas para diversas fases da ferramentas para diversas fases da compilaçãocompilação e e runtimeruntime - e - extensão e criação: xtensão e criação:
De De compiladores compiladores ee compiladores JIT compiladores JITDe ferramentas que manipulam a De ferramentas que manipulam a ASTAST (ex. (ex. IntellisenseIntellisense) ou a ) ou a ILIL
Microsoft Phoenix (2)Microsoft Phoenix (2)
Viabiliza conjunto alargado de Viabiliza conjunto alargado de soluções AOPsoluções AOPAd-hoc compilerAd-hoc compiler
Plug-insPlug-ins para o compilador que utilizam a para o compilador que utilizam a ASTAST para para aplicar aplicar adviceadvice ou criar ou criar joint pointsjoint points dinâmicos ( dinâmicos (hookshooks))
IL instrumentationIL instrumentationSemelhante ao anterior mas através de uma ferramenta Semelhante ao anterior mas através de uma ferramenta de de pós-processamentopós-processamento (carrega DLLs) (carrega DLLs)
Ad-hoc VMAd-hoc VMAtravés da extensão do Através da extensão do Compilador JITCompilador JIT
O compilador JIT passa a aplicar O compilador JIT passa a aplicar advice advice dinamicamentedinamicamente
Os Os pointcutspointcuts são avaliados em são avaliados em runtimeruntime
É possível É possível alterar pointcutsalterar pointcuts e e adviceadvice
A fase de A fase de weaving weaving deixa de ser necessáriadeixa de ser necessária
O Phoenix está já a ser utilizado (num O Phoenix está já a ser utilizado (num release RDK):release RDK):
Aspect MiningAspect Mining – detecção de código clonado – detecção de código clonado
Mais info: Mais info: http://www.cis.uab.edu/tairasr/phoenix/http://www.cis.uab.edu/tairasr/phoenix/
Para a manipulação do código intermédio Para a manipulação do código intermédio (MSIL):(MSIL):
Aspect.NETAspect.NET
SetPoint AOPSetPoint AOP
Meta.NETMeta.NET
WiccaWicca
Microsoft Phoenix (3)Microsoft Phoenix (3)
III - AOP multi-dimensional III - AOP multi-dimensional MDSoCMDSoC
MDSoC – MDSoC – Multi-dimensional separation of Multi-dimensional separation of concernsconcerns
DEMO – MDSoC DEMO – MDSoC com com Partial TypesPartial Types
DEMO – DEMO – Hyper/NetHyper/Net
MDSoC – Multi-Dimensional MDSoC – Multi-Dimensional Separation of ConcernsSeparation of Concerns
Transformação num Transformação num hiper-espaçohiper-espaço::
TigreTigre
AnimalAnimal
MamíferoMamífero
FocaFoca
OOP
AlimentaçãoAlimentaçãoAlimentaçãoAlimentação
DescansoDescansoDescansoDescanso
ProcriarProcriarProcriarProcriar Ser fêmea ou machoSer fêmea ou machoSer fêmea ou machoSer fêmea ou macho
LoggingLoggingLoggingLogging
SegurançaSegurançaSegurançaSegurança
AuditAuditAuditAudit
OntologiaOntologiaOntologiaOntologia
MDSoC – Multi-dimensional MDSoC – Multi-dimensional separation of concerns (2)separation of concerns (2)
Desenvolvida desde 1999 por Desenvolvida desde 1999 por Peri Tarr Peri Tarr e e Harold Harold OssherOssher
Implementação Implementação Java: Java: Hyper/JHyper/JPós-compiladorPós-compilador - funciona de modo análogo à - funciona de modo análogo à abordagem abordagem IL Instrumentation IL Instrumentation em .NETem .NET
Algumas ferramentas de aspectos .NET têm Algumas ferramentas de aspectos .NET têm liberdade sintáctica para suportar MDSoC (ex. liberdade sintáctica para suportar MDSoC (ex. AspectDNGAspectDNG))
Nós pensamos em MDSoC Nós pensamos em MDSoC ::
““The thoughts perfectly slot themselves into the The thoughts perfectly slot themselves into the rows, columns, layers, hyper-rows, hyper-columns, rows, columns, layers, hyper-rows, hyper-columns, and hyper-layers of a vast matrix.” and hyper-layers of a vast matrix.” Steven PinkerSteven Pinker
MDSoC c/ Partial TypesMDSoC c/ Partial Types
Ferramentas MDSoCFerramentas MDSoC
Hyper/J – JavaHyper/J – Java
Hyper VB.NetHyper VB.Net????
Hyper C#Hyper C#Limitado a trabalhar com uma só classe numa Limitado a trabalhar com uma só classe numa GUI específica GUI específica
Hyper/NetHyper/Net
(Beyond Partial Types)(Beyond Partial Types)
SumárioSumário
AOPAOPTem várias Tem várias vantagensvantagens práticas práticas
Existem implementações aceitáveis para Existem implementações aceitáveis para testestestes e e projectos não críticosprojectos não críticos (esses existem?) (esses existem?)
É uma área em É uma área em maturaçãomaturação
MDSoCMDSoCTodos devíamos usar através dos Todos devíamos usar através dos partial typespartial types do .NETdo .NET
Existe Existe poucas ferramentas poucas ferramentas para ir além dos partial para ir além dos partial typestypes
É uma área cujo É uma área cujo potencialpotencial completo está muito completo está muito pouco exploradopouco explorado
Recursos AOP e MDSoCRecursos AOP e MDSoC
Aspect Oriented Software Aspect Oriented Software DevelopmentDevelopment
http://AOSD.net (Wiki)http://AOSD.net (Wiki)
A minha página pessoalA minha página pessoalArtigo Artigo Hyper/NetHyper/Net
http://ptsoft.net/tdd/http://ptsoft.net/tdd/
[email protected]@ptsoft.net
Pergunte aos EspecialistasPergunte aos EspecialistasObtenha Respostas às Suas QuestõesObtenha Respostas às Suas Questões
Depois da apresentação:Depois da apresentação:Área de Área de DesenvolvimentoDesenvolvimento
Questionário de AvaliaçãoQuestionário de Avaliação Passatempo!Passatempo!
Complete o questionário de Complete o questionário de avaliação e devolva-o no balcão avaliação e devolva-o no balcão da recepção.da recepção.
Habilite-se a ganhar uma Xbox Habilite-se a ganhar uma Xbox 360 por dia!360 por dia!
DEV010DEV010
Programação Orientada a Aspectos Programação Orientada a Aspectos em .NETem .NET
© 2007 Microsoft Corporation. All rights reserved.© 2007 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.