Você está na página 1de 76

ISSN 1980393-1

9 771980 393000

00093

06 - Modelagem e automao com Workflow Foundation

.NET

[ Renato Jos Groffe ]

.NET

26 Integrao com Google D ocs

.NET

36 Conhea o Windows Phone 7.5

.NET

44 Novidades do HTML 5

Sumrio

Eng. de Software

Boas Prticas

.Net

[ Ericksen Viana Sampaio ]

[ Rodolpho Marques do Carmo ]

[ Diego Eduardo Ferreira ]

Boas Prticas

52 Princpios de Design de Servios

Boas Prticas

60 Design Patterns com .NET

Engenharia
de Software

[ Renato Jos Groffe ]

[ Vladimir Rech ]

Ol, eu sou o DevMan! Desta pgina em diante, eu estarei lhe ajudando a compreender com ainda
mais facilidade o contedo desta
edio. Ser um prazer contar com
sua companhia! Confira abaixo o
que teremos nesta revista:

66 Visual Studio 2010 para arquitetos de software


[ Fernando Ferreira ]

Brinde na web desta edio

Curso Novidades do Visual Studio 2010: WCF Data Services


Curso Novidades do Visual Studio 2010: Arquitetura de uma soluo

Vdeos

Para visualizar acesse o link:


http://www.devmedia.com.br/articles/listcomp.asp?keyword=net93videos&codigobanca=quebra

D seu feedback sobre esta edio!

Feedback
eu
sobre e
s

edio
ta

D
s

Gostou das vdeo aulas? O portal www.devmedia.com.br possui mais de 2 mil vdeo aulas e dezenas de cursos online sobre desenvolvimento de
software! Agora voc pode comprar as vdeo aulas que preferir e fazer sua prpria combinao de vdeos! Saiba mais em www.devmedia.com.br/creditos

A .NET Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D seu voto sobre esta edio, artigo por artigo, atravs do link:
www.devmedia.com.br/netmagazine/feedback
Para votar, voc vai precisar do cdigo de banca desta edio, que : quebra

Expediente

Editorial
EDITORIAL

o incio, desenvolver software no exigia conhecimento de padres e muito menos seguir especificaes.
Com o passar dos anos, o mercado comeou a se tornar mais exigente

em relao qualidade final das aplicaes. Utilizar boas prticas e trabalhar em


equipe, se tornou obrigatrio.
Ano 8 - 93 Edio 2012 - ISSN 1980-3931 - Impresso no Brasil

Nesta edio, temos como capa Visual Studio 2010 para Arquitetos de Softwares,
onde se encaixa perfeitamente na analogia realizada acima. Desenvolver diagramas, gerar especificaes, teste de performance e outros, so algumas das possibi-

Corpo Editorial

lidades que o VS 2010 traz para ns desenvolvedores. O Fernando Ferreira mostra


todas essas possibilidades.

Editor Geral
Rafael Silva (rafael@rlsystem.com.br)

Atendimento ao Leitor
A DevMedia conta com um departamento

Editor Tcnico
Paulo Quicoli (pauloquicoli@devmedia.com.br)

exclusivo para o atendimento ao leitor. Se voc


tiver algum problema no recebimento do seu

Seguindo o mesmo caminho, tambm temos o artigo do Vladimir Rech que inicia
a srie de artigos sobre MVP, MVC e MVVM. Nesta primeira parte explanado o MVP,
sendo realizado algumas comparaes com outros padres e um exemplo prtico
com ASP.NET e Windows Forms.

Equipe Editorial

exemplar ou precisar de algum esclarecimento

Vladimir Rech (vladimirrech@yahoo.com.br)


Renato Jos Groffe( renato.groffe@yahoo.com.br)

sobre assinaturas, exemplares anteriores, en-

Renato Groffe mostra na prtica o uso do Workflow Foundation para melhorar a

dereo de bancas de jornal, entre outros, entre

automao de processos de uma organizao. Alm disso, contamos tambm com

em contato com:

seu artigo que mostra os princpios do SOA na integrao com outras aplicaes e

www.devmedia.com.br/central
(21) 3382-5038

principalmente com outras tecnologias, algo cada vez mais importante, principal-

Kaline Dolabella - JP24185

Na Web

Publicidade

Jornalista Responsvel

www.devmedia.com.br/dotnet

Para informaes sobre veiculao de anncio


na revista ou no site e para fechar parcerias

Distribuio
FC Comercial e Distribuidora S.A
Rua Teodoro da Silva, 907
Graja - RJ - 206563-900

ou aes especficas de marketing com a


DevMedia, entre em contato com:
Cristiany Queiroz
publicidade@devmedia.com.br

mente para a nova era mobile.


Saindo um pouco da linha boas prticas e padres, temos o artigo do Ericksen
Viana que mostra a integrao do ASP.NET com a API do Google, mais precisamente
o Google Docs. Com a crescente era do Cloud Computing, torna-se cada vez mais
necessrio este tipo de integrao.
Rodolpho Marques mostra o Windows Phone 7.5, focando nas novas features para
o Visual Studio, SDK e os novos recursos do emulador. Para finalizar, contamos com
o artigo do Diego Ferreira que mostra as novidades do HTML 5.

Um grande abrao e uma excelente leitura!

A revista .net Magazine parte integrante da assinatura .NET


GOLD. Para mais informaes sobre o pacote .NET GOLD, acesse:
http://www.devmedia.com.br/dotnet

Fale com o Editor!


muito importante para a equipe saber o que voc est achando da revista: que tipo de artigo voc
gostaria de ler, que artigo voc mais gostou e qual artigo voc menos gostou. Fique a vontade para
entrar em contato com os editores e dar a sua sugesto!
Se voc estiver interessado em publicar um artigo na revista ou no site .NET Magazine, entre em
contato com os editores, informando o ttulo e mini-resumo do tema que voc gostaria de publicar:
Rafael Silva - Editor da Revista
rafael@rlsystem.com.br

Rafael Silva
rafael@rlsystem.com.br
Editor Chefe da .net Magazine e Easy .net Magazine
http://www.rlsystem.com.br
twitter.com/rafaellealsilva

.NET Brasil

WCF, SOA e Interoperabilidade

uando se leva em conta o cenrio


de TI em grandes organizaes, a
existncia de aplicaes concebidas nas mais variadas plataformas algo
mais do que frequente. O surgimento de
tecnologias como Web Services e XML,
impulsionou uma srie de esforos de
grandes companhias de tecnologia no
sentido de possibilitar a interoperabilidade entre solues heterogneas. Isto
viabilizou no apenas o intercmbio de
informaes entre softwares dentro de
uma companhia, como tambm permitiu
que a mesma pudesse estar interligada a
parceiros externos, com tais fatos desempenhando um papel de vital importncia
na continuidade do negcio em questo.
A tecnologia ASP.NET conta desde os
seus primrdios, com o suporte para a
construo de Web Services, sendo que
o formato normalmente empregado para
intercmbio de dados neste caso era o
padro SOAP (Simple Object Access Protocol, formato baseado em XML). O .NET
framework tambm contava at a verso
2.0 com outros recursos, como Remoting,
os quais eram normalmente utilizados
na construo de aplicaes distribudas
que envolvessem a utilizao de outros
protocolos que no o HTTP (normalmente
associado ao uso de Web Services): os padres TCP e MSMQ (Microsoft Message
Queuing) so exemplos disto.
O advento da verso 3.5 do .NET framework foi seguido pelo lanamento
da tecnologia WCF (Windows Communication Foundation). Pode-se afirmar
que esta foi uma aposta bem sucedida
da Microsoft, a qual procurou oferecer
uma soluo flexvel para a construo
de aplicaes distribudas.
WCF est fundamentada em princpios
de SOA (Service Oriented Architecture
- ou Arquitetura Orientada a Servios),
bem como capaz de ser utilizada com os
principais padres atuais de transferncia de informaes: SOAP (para a construo de Web Services convencionais),
TCP (restrito a aplicaes .NET), MSMQ,

JSON (JavaScript Object Notation, formato mais simplificado que o SOAP/


XML, sendo normalmente utilizado em
invocaes de servios a partir de cdigo
Javascript), RSS (Really Simple Syndication, representa um conjunto de formatos
empregados para a notificao de atualizaes em blogs, sites de notcias, dentre
outros rgos de informao).
Graas a estas caractersticas, aplicaes
concebidas a partir de outras tecnologias
(como Java e PHP) podem vir a consumir,
sem maiores dificuldades, servios construdos a partir de WCF. O amplo escopo
de formatos de comunicao cobertos por
este mecanismo do .NET tambm permite
que um mesmo servio possa ser acessado
via HTTP ou TCP, necessitando apenas de
ajustes em sua configurao. Tudo isso atesta o alto grau de reuso que se obtm com a
construo de solues em WCF.
Considerando ainda, a interoperabilidade
entre aplicaes, gigantes do mercado de
tecnologia como Microsoft, Oracle, IBM,
dentre outros, vm trabalhando lado a
lado nos ltimos anos, objetivando com
isto, o estabelecimento de regras que
ditem comportamentos padronizados a
serem empregados em Web Services: os
resultados desta cooperao o conjunto
de especificaes chamado WS-*.
Alguns exemplos so os padres WSSecurity (que contempla mecanismos de
segurana) e WS-Transaction (o qual contm meios para o controle transacional em
operaes envolvendo servios).
Sempre preocupada com a evoluo e
a compatibilidade de WCF com outras
tecnologias, a Microsoft lanou em
Junho/2011 a extenso WCF Express Interop Bindings. Trata-se de um recurso
open-source para o Visual Studio, possibilitando atravs de um conjunto de
configuraes que a interoperabilidade
entre servios WCF e aplicaes hospedadas nos principais servidores, Java
(Oracle WebLogic, Oracle Metro, IBM
WebSphere e Apache Axis2) ocorra de
forma mais simplificada.

Renato Jos Groffe


renato.groffe@yahoo.com.br

Atua como consultor em atividades voltadas


ao desenvolvimento de softwares h mais de
10 anos. Bacharel em Sistemas de Informao,
com especializao em Engenharia de Software.
Microsoft Certified Technology Specialist (Web,
WCF, Distributed Applications, ADO.NET, Windows Forms), Oracle Certified Associate (PL/SQL),
Sun Certified (SCJP, SCWCD), ITIL Foundation V2.

Este projeto encontra-se atualmente no


site Codeplex (http://wcf.codeplex.com/
wikipage?title=WCF Express Interop
Bindings).
Contudo, um alerta deve ser feito no
que se refere construo de projetos
que envolvam servios. Uma das principais preocupaes da metodologia SOA
diz respeito ao reuso. Logo, a opo por
construo de um Web Service deve
ser feita analisando se realmente outras
aplicaes, muitas vezes num hipottico
cenrio futuro, podero se beneficiar das
funcionalidades disponibilizadas pelo
mesmo. O simples uso de WCF sem uma
abordagem mais criteriosa pode conduzir
a limitaes para a aplicao que se est
desenvolvendo, haja vista que o acesso
aos dados ocorre de maneira remota: uma
soluo convencional, bem estruturada e
acessando um repositrio de dados atravs
de um driver especfico pode, nestes casos,
apresentar uma melhor performance.
Outro ponto de ateno diz respeito a um
software ser ou no orientado a servios.
prtica recorrente de alguns fornecedores
de software, alegar que seus produtos se
adequam aos conceitos de SOA, simplesmente por se basearem em Web Services.
Uma Arquitetura Orientada a Servios
engloba uma srie de prticas e recomendaes, dentre as quais o reuso e a interoperabilidade so pilares fundamentais.
Logo, um servio que no tenha sido bem
projetado, no ser necessariamente um
exemplo de soluo SOA.

Seo .NET: Nesta seo voc encontra artigos intermedirios sobre as tecnologias .net

Workflow Foundation

Utilizando Workflows para a modelagem e


Resumo DevMan
De que se trata o artigo:
Este artigo tem por objetivo demonstrar a construo de aplicaes que automatizam processos de
negcio dentro .NET framework. A fim de se cumprir tal objetivo ser utilizada a tecnologia Workflow
Foundation, uma tecnologia que visa a automao de processos de negcios.

Em que situao o tema til:


A tecnologia conhecida como Windows Workflow Foundation, pode ser uma excelente alternativa para
cenrios que exijam a automao de processos de negcio. Este mecanismo da plataforma .NET permite
que as atividades que caracterizam um processo sejam especificadas graficamente, com o mesmo valendo
para as interaes entre as diferentes etapas consideradas: ao modelo visual gerado a partir disto d-se
o nome de workflow.

Workflow Foundation - Utilizando Workflows para a modelagem e automao de processos de negcio:


A construo de aplicaes de software que automatizem processos de uma organizao pode se revelar,
em muitos casos, como uma tarefa bastante rdua. As dificuldades podem se acentuar em cenrios nos quais
a lgica de negcios esteja sujeita a modificaes frequentes, ou mesmo, o processo em questo resulte
na execuo de atividades por prolongados perodos de tempo. Alm disso, este tipo de funcionalidade
conta normalmente com uma codificao extensa, o que dificulta no apenas a manuteno das estruturas
existentes, como tambm a compreenso do processo como um todo. A representao grfica por meio
de um workflow simplifica no apenas o entendimento do processo em questo, como tambm permite
a obteno de um cdigo-fonte mais conciso e flexvel diante de provveis mudanas.

rot i na de u ma orga n i zao


compreende processos de negcio voltados aos mais variados
objetivos, com a execuo conjunta das
atividades que englobam os mesmos permitindo a continuidade das operaes. Um
processo deve ser entendido, em termos
gerais, como um agrupamento de tarefas
relacionadas, sendo que a realizao das
mesmas visa atender a uma demanda ou
meta previamente traada.
Levando em conta as peculiaridades do
ambiente empresarial, nota-se que so
comuns tanto situaes nas quais existem
processos completamente automatizados
e que dependem fortemente de recursos
de software, assim como procedimentos
cujas atividades so desempenhadas
apenas por seres humanos, e sem a utili-

6 .NET Magazine Edio 93

zao de meios eletrnicos. Existe ainda


a possibilidade de cenrios mistos, nos
quais atividades manuais so combinadas
com tarefas automatizadas, buscando-se
assim o cumprimento de um determinado
objetivo de negcio.
Diante de um contexto caracterizado por
profundas e constantes alteraes, muitos
gestores vm focando na automao de
diversos processos em suas respectivas
reas, buscando com isto um maior nvel
de eficincia operacional em atividades
corriqueiras. Tal automao normalmente
se d, por meio da adoo de uma soluo
de software direcionada ao atendimento
de uma necessidade especfica.
comum que aplicaes concebidas para
a automao de um processo (ou de partes
deste), apresentem um cdigo extenso e

automao de processos de negcio


Renato Jos Groffe
que dificulte sua compreenso. Isto acaba por dificultar a manuteno de tais solues quando da necessidade de modificao de
um processo, sobretudo quando se toma como base a estrutura
complexa com a qual as mesmas foram construdas.
Considerando todos estes fatores, inmeras alternativas foram
concebidas visando automao de processos de negcio por
meio de recursos de software. A metodologia conhecida como
BPM (Business Process Modeling) um exemplo, oferecendo em
suas definies uma srie de tcnicas para a modelagem de processos. Inmeras ferramentas de mercado encapsulam elementos
deste paradigma, contando normalmente com mecanismos para
a modelagem grfica de fluxos de atividades.
A Microsoft disponibiliza algumas alternativas voltadas
automao de processos, em todos os exemplos citados a seguir,
a especificao do fluxo de atividades realizada graficamente,
sendo que ao modelo resultante d-se o nome de workflow:
BizTalk Server: plataforma centralizada para a integrao e o
gerenciamento de processos de negcio;
Windows Workflow Foundation: permite a construo de workflows para uso dentro da plataforma .NET;
Integration Services: componente do SQL Server que permite a
construo de solues para a manipulao de dados, empregando
para isto workflows.
O objetivo deste artigo abordar a construo de aplicaes
voltadas automao de processos de negcio, fazendo para isto
uso da tecnologia Workflow Foundation (atualmente na verso
4.0). Para isto, sero apresentados conceitos a respeito deste
framework, bem como implementada uma soluo de exemplo
que demonstre o uso do mesmo.

Quando utilizar workflows?


Recomendam-se que workflows sejam construdos em .NET em
cenrios nos quais, o processo em questo de longa durao, ou
ainda, sofra alteraes constantemente em sua lgica de negcio.
A possibilidade de representar visualmente o processo que se
est automatizando pode tambm, em muitos casos, influenciar
na deciso por esta tecnologia.
Um exemplo de processo de longa durao seriam os diversos
passos que envolvem a aprovao de despesas: inicia-se pelo
lanamento por parte de um funcionrio de um gasto que
ainda ser efetuado, passando ainda por etapas de aprovao
do departamento responsvel, e por fim, da rea financeira da
organizao. Processos da rea de suprimentos e da rea pro-

dutiva, tambm representam situaes que se enquadram neste


perfil. Considerando tudo isto, as aplicaes responsveis pelo
controle destes tipos de procedimentos, precisam ser capazes de
controlar provveis paradas entre diferentes etapas. Implementar
partindo do zero, e com tcnicas convencionais no nada fcil,
sendo o framework Workflow Foundation uma alternativa a
demandas como estas.

Nota do DevMan
BPM (Business Process Modeling) uma metodologia que foca na modelagem de processos
de negcio a partir do mapeamento das atividades que compem os mesmos, assim como dos
relacionamentos que se estabelecem entre estas ltimas.
Uma das linguagens disponveis para a representao de fluxos de atividades a BPMN (Business
Process Model and Notation). Tal linguagem na verdade, uma especificao para a modelagem
grfica de processos de negcio, sendo mantida pela OMG (Object Management Group, consrcio
formado por grandes companhias do mercado de tecnologia como Microsoft, Oracle e IBM e que est
voltado para o estabelecimento de padres).
Outra especificao a ser citada a BPEL (Business Process Execution Language). Trata-se de uma
linguagem para execuo de modelos contendo processos de negcios, sendo mantida por um grupo
conhecido como OASIS (Organization for the Advancement of Structured Information Standards).

Outros cenrios vlidos para o uso de workflows so situaes


nas quais, aspectos legais conduzem devido aos mais variados
motivos, a mudanas frequentes nas regras de funcionamento de
processos. Mudanas podem ser efetuadas de maneira rpida num
workflow, dispensando muitas vezes novos trechos extensos de
cdigo ao longo de um projeto.

Windows Workflow Foundation: uma viso geral


O framework Workflow Foundation pode ser descrito, basicamente, como uma tecnologia voltada construo de workflows
voltados que implementam de forma automatizada partes, ou
ainda, todo um processo de negcio. A elaborao de um workflow acontece dentro do Visual Studio, o qual conta com um
editor grfico para a modelagem das interaes entre diferentes
tipos de atividade.
Workflows podem ser gerados em uma biblioteca separada
para posterior reuso por outras solues em .NET, dentro de uma
aplicao, ou ainda, como um servio WCF (a aplicaes deste
ltimo tipo d-se o nome de Workflow Services). O modelo que
corresponde a um workflow um arquivo de extenso .xaml (ou
.xamlx no caso de um Workflow Service).

Edio 93 .NET Magazine

Workflow Foundation

O elemento bsico para a montagem de um workflow uma


atividade. O .NET Framework disponibiliza dentro do namespace
System.Activities diversos de tipos de atividades que podem ser
facilmente configuradas para a construo de processos.
Basicamente, workflows criados atravs deste framework podem
ser classificados em 2 tipos:
Sequential workflow: o fluxo de execuo das atividades ocorre
passo-a-passo, sendo possvel ainda o uso de desvios condicionais
dentro da lgica que se est elaborando. Seu uso recomendado na
modelagem de processos mais simplificados e sem interveno humana, sendo equivalentes a rotinas escritas de maneira procedural
dentro de uma linguagem de programao. Dentro deste modelo,
as diversas atividades que constituem o processo so agrupadas
dentro de uma atividade principal do tipo Sequence;
Flowchart workflow: permite a modelagem de um processo
num padro grfico similar a um diagrama de atividades UML.
So teis na representao de processos com uma estrutura
sequencial, mas que tambm contam com loops que desviam
o fluxo de execuo para estados anteriores. Diferentemente de
um Sequential workflow, este tipo de workflow recomendvel
na modelagem de processos que tambm contem com interaes
humanas. Em um Flowchart workflow as diversas atividades
que fazem parte de um processo so agrupadas dentro de uma
atividade do tipo Flowchart.
As interaes entre as atividades que compem um workflow
envolvero, em grande parte dos casos, o fluxo de informaes
de um ponto a outro do processo em questo. Assim, procurando oferecer suporte ao intercmbio de dados entre as partes que
constituem um workflow, a tecnologia Workflow Foundation
disponibiliza recursos como variveis, argumentos e expresses,
utilizando para isto dos mesmos conceitos presentes numa linguagem de programao convencional.
Variveis apresentam, dentro de um workflow, um escopo a
partir do qual a utilizao das mesmas vlida. Pode-se definir
que tal escopo corresponda a todo o workflow, ou ainda, que a
utilizao de uma varivel seja possvel apenas dentro de um
conjunto de atividades (as quais podem estar agrupadas sob a
forma de uma atividade do tipo Sequence ou Flowchart).
As interaes entre as atividades que constituem um workflow
envolvero o fluxo de informaes de um ponto a outro do processo em questo. Assim, buscando oferecer suporte ao intercmbio de dados entre as partes que constituem um workflow, a
tecnologia Workflow Foundation disponibiliza mecanismos como
variveis, expresses (baseadas em VB Expressions) e argumentos
(de entrada, de sada, ou ainda, uma combinao destas duas caractersticas), valendo-se dos mesmos conceitos existentes numa
linguagem de programao convencional.
De acordo com a finalidade a que se destinam, os variados tipos
de atividades nativos do framework .NET 4.0 podem ser agrupados nas seguintes categorias:
Control Flow: oferece construes para o controle de fluxo em
modelos de processos do tipo Sequential workflow;

8 .NET Magazine Edio 93

Flowchart: permite gerenciar o fluxo de execuo em modelos


do tipo Flowchart workflow;
Messaging: dentro desta categoria so disponibilizadas atividades que possibilitam a integrao entre as tecnologias Workflow
Foundation e WCF;
Runtime: conta com atividades para persistir uma instncia de
um workflow, ou ainda, encerrar a execuo do mesmo a partir
de um determinado ponto;
Primitives: disponibiliza recursos de uso geral para a invocao
de mtodos, atribuio de valores a uma varivel, interrupo da
execuo do workflow por um perodo de tempo, etc.;
Transaction: possibilita o uso de controles transacionais dentro
de instncias de workflows;
Collection: oferece suporte para a manipulao de coleo de
objetos (adio, excluso de itens, etc.);
Error Handling: disponibiliza recursos para a manipulao de
excees (tratamento, gerao de erros) dentro de um workflow;
Migration: atravs do tipo Interop presente nesta categoria
possvel a execuo de atividades criadas a partir do .NET
framework 3.5.
Alm das diversas categorias aqui mencionadas, atividades
customizadas podem ser criadas herdando-se para isto do tipo
CodeActivity.

Nota do DevMan
XAML a sigla para o termo em ingls para Extensible Application Markup Language.Trata-se de uma
linguagem declarativa baseada em XML, a qual foi concebida pela Microsoft para uso na definio
de elementos de interfaces grficas, data binding, eventos, dentre outros aspectos. empregada
em larga escala, dentro da plataforma .NET, em solues que envolvam as tecnologias Windows
Presentation Foundation (WPF), Workflow Foundation e Silverlight.

Benefcios do uso de workflows


O objetivo desta seo apresentar algumas das vantagens resultantes do uso do framework Workflow Foundation na construo
de softwares concebidos para a automao de processos.
Conforme j discutido, representar graficamente um processo
simplifica os esforos empregados na modelagem do mesmo, visto
que este tipo de prtica, por ser mais intuitiva, possibilita uma maior
compreenso das atividades envolvidas. O funcionamento de um
workflow pode ser modificado atravs da adio e/ou remoo de
atividades, algo que seria uma tarefa um pouco mais trabalhosa
em uma soluo que conte com uma codificao extensa.
A execuo de atividades paralelas pode ser modelada graficamente, o que bastante til, sobretudo quando se leva em
considerao a complexidade em se desenvolver uma lgica para
execuo simultnea de diversas rotinas de software. Assim, este
tipo de recurso contribui em muito para tornar mais produtiva
construo da lgica de processos que envolvam paralelismo.
O uso de transaes e a manipulao de excees so aspectos
recorrentes em aplicaes corporativas. A tecnologia Workflow

Foundation tambm dispe de mecanismos para controle transacional e tratamento de erros, possibilitando assim a construo mais
simplificada de solues que empreguem estes tipos de recursos.
A monitorao do que acontece em workflows pode ser feita por
meio do recurso conhecido como tracking. Atravs desta tcnica,
diversas informaes relativas execuo de instncias de workflow podem ser gravadas em um meio de persistncia (como uma
base de dados, por exemplo). Isto pode se revelar como um recurso
de bastante utilidade no acompanhamento, ou no diagnstico de
problemas com um workflow que j se encontre em operao.
Alm dos recursos disponibilizados por default pela tecnologia
Workflow Foundation, a mesma permite que suas capacidades sejam estendidas a partir da construo de atividades customizadas.
Estruturas deste tipo derivam de uma classe abstrata chamada
CodeActivity. Importante ressaltar que uma atividade customizada em nada difere dos outros tipos de atividades disponibilizados
pelo .NET, este tipo de construo pode receber e retornar parmetros, ou mesmo, devolver valores mediante execuo.
Outro benefcio das atividades customizadas est em seu potencial de reuso: uma estrutura deste tipo pode ser empregada
ao longo de outras solues que dependam das funcionalidades
definidas pela mesma.
importante mencionar tambm os aspectos positivos da integrao entre as tecnologias Workflow Foundation e WCF. Workflows ao serem expostos como Web Services, por exemplo, tm seu
potencial de reuso aumentado significativamente j que podem ser
utilizados por qualquer tipo de aplicao capaz de consumir um
servio. Alm disso, a utilizao de padres como SOAP em tais
solues, possibilita a interoperabilidade com outras plataformas
bastante heterogneas (Java e mainframe, por exemplo).
Pontos de ateno ao se utilizar workflows em .NET
So inegveis as vantagens de se empregar o framework Workflow Foundation em inmeros cenrios. Contudo, diversos aspectos devero ser analisados durante o projeto de solues que
venham a se utilizar desta tecnologia.
A primeira questo que vem tona, neste caso, referente s
diferenas que existem em workflows construdos nas verses 3.5
e 4.0 do .NET. Iniciando com o .NET 3.5, o framework Workflow
Foundation foi totalmente remodelado quando do lanamento
da plataforma 4.0. Embora esta ltima verso com alguns mecanismos que permitam o uso de workflows originrios de aplicaes construdas no framework 3.5, a quantidade de alteraes
introduzidas considervel, obrigando os desenvolvedores a se
familiarizarem com uma srie de novos conceitos.
O uso de workflows desaconselhvel na implementao de
funcionalidades do tipo CRUD. Atividades relacionadas manuteno de dados no apresentam uma lgica de alta complexidade,
ou mesmo, no encapsulam processos cuja execuo se estenda por
um perodo considervel de tempo. Aspectos como estes dois fatores
mencionados justificariam uma abordagem baseada no Workflow
Foundation, o que no o caso em funes gerais de cadastro.
Deve-se sempre ponderar acerca do nvel de detalhamento com
o qual, os fluxos de um processo sero especificados: um nmero

excessivo de atividades tende a aumentar a complexidade de um


workflow, sendo que problemas deste tipo poderiam ser resolvidos com a utilizao de atividades customizadas (baseadas
na classe CodeActivity), com estas ltimas agrupando em suas
definies de tarefas relacionadas de maneira a simplificar as
estruturas resultantes.
Considerando ainda a implementao de workflows, devem
ser tomados certos cuidados quanto utilizao de VB Expressions durante a construo de funcionalidades automatizando
processos. O uso indiscriminado deste recurso pode tornar um
workflow bem mais complexo do que o esperado, com regras de
negcio espalhadas ao longo do arquivo .xaml (ou .xamlx no caso
de um Workflow Service). Alm disso, tal prtica pode dificultar
a depurao de um processo quando da ocorrncia de erros lgicos (a identificao deste tipo de problema em uma expresso
costuma ser menos intuitiva). Diante disto, o uso de atividades
customizadas neste contexto pode no apenas contribuir para
uma melhor organizao das estruturas que constituem um
workflow, como tambm possibilitar o teste unitrio de partes
que compem um processo.

Exemplo de construo de uma soluo de workflow


O desenvolvimento das aplicaes apresentadas neste artigo foi
efetuado por meio da utilizao do Microsoft Visual Studio 2010
Ultimate Edition, alm do SQL Server Express 2008 e do Fluent

Edio 93 .NET Magazine

Workflow Foundation

NHibernate 1.2 (juntamente com a verso 3.1 do framework


NHibernate).
Ser demonstrado mais adiante, como exemplo de utilizao
de um workflow na plataforma .NET, a construo de uma
soluo para processamento de arquivos contendo informaes
de contas a serem recebidas. A necessidade de integrao com
instituies bancrias via arquivos-texto representa, dentro
de muitas organizaes, um tipo de ocorrncia frequente em
aplicaes voltadas ao controle do fluxo financeiro. O arquivo
em questo englobar dados de boletos a serem pagos por
clientes que adquiriram produtos via Internet em uma determinada data, possuindo: um registro header (cabealho);
vrios registros de detalhe (com cada um destes ltimos sendo
referente a um boleto); um registro footer encerrando o conjunto
de informaes.
O registro header est especificado na Tabela 1. J a estrutura dos registros de detalhe referentes a boletos est listada
na Tabela 2, ao passo que a Tabela 3 apresenta a estrutura do
registro footer.
Um registro header contm normalmente dados que so comuns a todas as outras informaes de detalhe de um arquivo.

J registros do tipo footer so comumente empregados para na


validao da estrutura de um arquivo, indicando normalmente
o trmino do arquivo, alm de conter ainda o nmero total de
linhas deste ltimo.
A estrutura de registros adotada para a aplicao de exemplo
um resumo do que normalmente ocorreria num cenrio real.
Muitas instituies bancrias disponibilizam layouts para o intercmbio de informaes financeiras com seus clientes corporativos,
sendo que tal padro conhecido como CNAB. Este ltimo, prev
arquivos com diversos tipos de registros, cada qual sendo formado
por inmeros campos.
Considerando a soluo de exemplo demonstrada neste artigo,
arquivos a serem processados pela mesma podero assumir os
seguintes status:
Aguardando processamento: arquivos enviados por uma instituio bancria e que ainda no foram processados;
Arquivo invlido: o contedo do arquivo em questo no atende
ao layout apresentado nesta seo;
Processamento efetuado, porm com inconsistncias: a estrutura
do arquivo em questo vlida, contudo alguns de seus registros
apresentam inconsistncias;

Campo

Tamanho

Pos. Inicial

Pos. Final

Formato

Tipo de Registro

001

001

001

Preenchido com 0 (zero).

CNPJ

014

002

015

Texto / dgitos numricos.

Razo do Cedente

050

016

065

Texto alinhado com espaos.

Data de Emisso dos Boletos

008

066

073

Data no formato aaaammdd.

Cdigo do Cedente

007

074

080

Texto alinhado com espaos.

Filler

050

081

130

Espaos.

Cdigo do Banco

005

131

135

Texto alinhado com espaos.

Cdigo da Agncia

005

136

140

Texto alinhado com espaos.

Conta Corrente

010

141

150

Texto alinhado com espaos.

Campo

Tamanho

Pos. Inicial

Pos. Final

Formato

Tipo de Registro

001

001

001

Preenchido com 1 (um).

CPF / CNPJ Sacado

014

002

015

Texto alinhado com espaos.

Nome do Sacado

050

016

065

Texto alinhado com espaos.

Data de Vencimento

008

066

073

Data no formato aaaammdd.

Cd. Documento

015

074

088

Texto alinhado com espaos.

Filler

032

089

120

Espaos.

Vl. Cobrana

015

121

135

Numrico, 2 casas decimais.

Vl. Multa Diria

015

136

150

Numrico, 2 casas decimais.

Tabela 1. Estrutura do registro header

Tabela 2. Estrutura do registro de detalhe


Campo

Tamanho

Pos. Inicial

Pos. Final

Formato

Tipo de Registro

001

001

001

Preenchido com 9 (um).

Filler

144

002

145

Espaos.

Qtde. Registros do Arquivo (incluindo footer)

015

146

150

Nmero inteiro.

Tabela 3. Estrutura do registro footer

10 .NET Magazine Edio 93

Processamento efetuado com sucesso: os boletos constantes no


arquivo foram importados normalmente, sem que fossem constatadas quaisquer inconsistncias.
O workflow que ser construdo para o tratamento de arquivos
relativamente simples, tendo por objetivo demonstrar como recursos da tecnologia Workflow Foundation podem ser empregados
na automao de processos. Um cenrio real envolveria uma srie
de aspectos que foram, para efeitos de simplificao, omitidos na
aplicao de exemplo.

Gerao da Base de Dados


O servio detalhado a seguir utilizar uma base de dados chamada TesteWorkflow. Este banco de dados conter tabelas para
o controle de arquivos recebidos de instituies bancrias e que
devero ser carregados, ttulos a receber/boletos, contas cedentes
s quais estaro vinculados tais boletos, status possveis para
arquivos, e ainda, possveis inconsistncias que tenham ocorrido
durante o processamento do workflow. Existir tambm uma view
empregada na consulta ao status atual em que se encontra um determinado arquivo. No arquivo para download do material deste
artigo encontra-se o script SQL para criao da base de dados.

Exemplo de utilizao do framework Worflow Foundation


A fim de se construir a aplicao para testes, ser necessrio criar
uma Solution no Visual Studio chamada TesteWorkflow. O objetivo
da mesma demonstrar como recursos do framework Workflow
Foundation seriam empregados, chegando-se assim implementao de um processo para carga de arquivos. Essa soluo ser
constituda, por sua vez, pelos projetos listados a seguir:
TesteWorkflow.Domain.Models: nesta biblioteca estaro as classes que representam os diversos tipos de informaes possveis
de serem utilizadas pelo workflow da aplicao de exemplo, ou
ainda, empregadas na consulta do status de processamento de
arquivos enviados por instituies bancrias;
TesteWorkflow.DataAccess: projeto no qual sero implementadas as classes de acesso a dados, fazendo-se uso para isto do
framework NHibernate;
TesteWorkflow.Business: Class Library que conter tipos responsveis por invocar a camada de acesso a dados, alm de regras
de negcios;
TesteWorkflow.Files: biblioteca formada por classes empregadas
na manipulao de informaes contidas em arquivos-texto;
TesteWorkflow.Process: aplicao do tipo Workflow Console
Application; conter o workflow que ser utilizado para o processamento de arquivos;
TesteWorkflow.UI.ConsultaImportacoes: aplicao MVC atravs da qual podero ser visualizadas, basicamente, informaes
relativas s importaes de boletos efetuadas pelo worklfow de
exemplo.
TesteWorkflow.Domain.Models uma Class Library na qual
esto definidas:

Classes para a manipulao de informaes referentes importao de arquivos, correspondendo a estruturas definidas na base de
dados de testes: ArquivoProcessamento, InconsistenciaArquivo,
TituloAReceber e DetalhamentoStatusArquivo;
O enumeration StatusProcessamentoArquivo.
O tipo ArquivoProcessamento contm informaes de arquivos
j processados ou no pelo workflow a ser construdo neste artigo;
DetalhamentoStatusArquivo ser utilizado para a consulta ao
status em que se encontra um arquivo. J InconsistenciaArquivo uma classe empregada para o controle de inconsistncias
ocorridas durante a importao de um arquivo enviado por uma
instituio bancria. TituloAReceber um tipo que representa
boletos que foram importados por meio do processo que estar
sendo implementado aqui. Todas estas classes encontram-se
definidas na Listagem 1.
StatusProcessamentoArquivo (Listagem 2) um enumeration
que ser empregado, basicamente, para o controle dos diferentes
status possveis para os arquivos tratados pelo workflow de
exemplo.
TesteWorkflow.DataAccess uma Class Library na qual se
especificou:
Uma classe bsica para a criao de sesses de acesso base de
dados: BaseDAL;
Tipos empregados no mapeamento da estrutura de objetos
consumidos pelas aplicaes de teste para construes correspondentes na base de dados: ArquivoProcessamentoMap, InconsistenciaArquivoMap, TituloAReceberMap e Detalhamento
StatusArquivoMap;
Classes de acesso a dados que empregam tcnicas de mapeamento objeto-relacional para a manipulao de informaes:
ProcessamentoArquivosDAL e TitulosAReceberDAL.
O tipo BaseDAL (Listagem 3) consumido pela classe de acesso
a dados, retornando atravs do mtodo CreateSession instncias
de objetos que implementem a interface ISession. atravs de
tais instncias fornecidas pelo framework NHibernate e geradas
atravs do atributo esttico _SessionFactory que ocorrer a conexo com a base de dados.
Para a montagem da factory geradora de sesses faz-se uso do
Fluent NHibernate; isto acontece por meio da classe Fluently,
sendo que tal procedimento envolve as diversas etapas apresentadas a seguir.
Primeiramente, procede-se com uma chamada ao mtodo esttico Configure, a partir do tipo Fluently, retornando-se com isto
um objeto de configurao prprio do Fluent NHibernate (classe
FluentConfiguration).
Na sequncia, a chamada ao mtodo Database permite aplicar
ao objeto de configurao o que foi especificado em uma string de
conexo do SQL Server. Para isto, utiliza-se a classe MsSqlConfiguration do Fluent NHibernate com o objetivo de manipular tal
string de conexo, de maneira que a mesma retorne um objeto no
formato esperado pelo mtodo Database.

Edio 93 .NET Magazine

11

Workflow Foundation

Listagem 1. Classes ArquivoProcessamento, InconsistenciaArquivo, TituloAReceber e DetalhamentoStatusArquivo


...
namespace TesteWorkflow.Domain.Models
{
public class ArquivoProcessamento
{
public virtual int Id { get; set; }
public virtual string DsCaminhoArquivo { get; set; }
public virtual DateTime DtRecebimentoArquivo { get; set; }
public virtual int CdStatus { get; set; }
public virtual DateTime? DtProcessamentoArquivo { get; set; }
}
public class InconsistenciaArquivo
{
public virtual int Id { get; set; }
public virtual int IdArquivo { get; set; }
public virtual string DsProblema { get; set; }
}
public class TituloAReceber
{
public virtual int Id { get; set; }
public virtual int IdContaCedente { get; set; }
public virtual DateTime DtEmissao { get; set; }
public virtual DateTime DtVencimento { get; set; }
public virtual string CdDocumento { get; set; }
public virtual string CPFCNPJSacado { get; set; }
public virtual string NomeSacado { get; set; }
public virtual decimal VlCobranca { get; set; }
public virtual decimal VlMultaDiaria { get; set; }
}
public class DetalhamentoStatusArquivo
{
public virtual int Id { get; set; }
public virtual string DsCaminhoArquivo { get; set; }
public virtual DateTime DtRecebimentoArquivo { get; set; }
public virtual int CdStatus { get; set; }
public virtual string DsStatus { get; set; }
public virtual DateTime? DtProcessamentoArquivo { get; set; }
}
}
Listagem 2. Enumeration StatusProcessamentoArquivo
...
namespace TesteWorkflow.Domain.Models.Enums
{
public enum StatusProcessamentoArquivo
{
AguardandoProcessamento = 1,
ArquivoInvalido = 2,
ProcessadoComInconsistencias = 3,
ProcessadoNormalmente = 4
}
}

A invocao do mtodo Mapping atualiza o objeto de configurao, levando ao carregamento de todas as classes de mapeamento,
tipos estes que foram definidos dentro da biblioteca TesteWorkflow.DataAccess.
Finalmente a chamada ao mtodo BuildSessionFactory resultar na criao de uma instncia do tipo ISessionFactory, a qual
armazenada numa varivel esttica (_SessionFactory), visando
com isto possibilitar o reuso da mesma ao longo da utilizao do
mtodo CreateSession.

12 .NET Magazine Edio 93

O NHibernate conta em sua estrutura interna, com implementaes de ISessionFactory que variam de acordo com o tipo de banco
de dados. A utilizao da interface ISessionFactory permite aos
programadores desconsiderar tais detalhes, focando com isso nas
funcionalidades oferecidas por este framework de persistncia.
Chamadas ao mtodo OpenSession no objeto do tipo ISessionFactory iro gerar, instncias de ISession associadas ao banco de
dados configurado na factory.
Assim, uma instncia do tipo ISession pode ser considerada
como substituta, dentro do NHibernate, para um objeto do tipo
Connection que seria obtido ao se utilizar o ADO.NET. Esta similaridade acontece pelo fato da mesma fornecer os mecanismos
necessrios para o acesso a um banco dados, bem como possibilitar
o uso de tcnicas para a realizao de controle transacional.

Nota do DevMan
O Fluent NHibernate disponibiliza, alm do tipo MsSqlConfiguration j mencionado aqui,
outras classes de configurao para acesso a bancos de dados. Alguns exemplos disto so os
tipos OracleConfiguration, PostgreSQLConfiguration, DB2Configuration, MySQLConfiguration e
FirebirdConfiguration.

Listagem 3. Classe BaseDAL


...
using NHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
namespace TesteWorkflow.DataAccess.Base
{
internal class BaseDAL
{
// Factory utilizada para a gerao de sesses.
private static ISessionFactory _SessionFactory;
public static ISession CreateSession()
{
if (_SessionFactory == null)
{
_SessionFactory = Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2008.ConnectionString(
c => c.FromConnectionStringWithKey(TesteWorkflow))
)
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<BaseDAL>())
.BuildSessionFactory();
}
return _SessionFactory.OpenSession();
}
}
}

As classes que representaro os mapeamentos entre tipos definidos na aplicao e estruturas da base de dados encontram-se
definidas na Listagem 4. O tipo ArquivoProcessamentoMap

liga a classe ArquivoProcessamento tabela de arquivos


para processamento; InconsistenciaArquivoMap e TituloAReceberMap fazem o mesmo com InconsistenciaArquivo e
TituloAReceber no que se refere s tabelas de inconsistncias
no processamento e ttulos / boletos importados. J DetalhamentoStatusArquivoMap vincula o tipo DetalhamentoStatus
Arquivo view que retorna informaes detalhadas sobre o s
tatus de processamento de um arquivo.
ArquivoProcessamentoMap, InconsistenciaArquivoMap, Titulo
AReceberMap e DetalhamentoStatusArquivoMap herdam de
ClassMap, o qual um tipo genrico do Fluent NHibernate que
recebe como parmetro uma entidade empregada na manipulao
de dados. por meio deste recurso que se dispensa o uso dos
arquivos XML de configurao, algo que seria obrigatrio com a
utilizao isolada do NHibernate.
Na Listagem 5 encontra-se a definio do tipo ProcessamentoArquivosDAL. O mesmo ser responsvel pela manipulao de
dados referentes a contas cedentes, arquivos j processados ou no
e, ainda, provveis inconsistncias ocorridas durante a execuo
do workflow de testes. Esta classe utiliza-se do tipo BaseDAL para
a obteno de sesses para conexo base de dados, e a partir
disto, manipular estruturas como tabelas e views por meio de
recursos oferecidos pelo NHibernate.

Nota do DevMan
IEnumerable<T> uma interface pertencente ao namespace System.Collections.Generics, sendo
normalmente implementada por classes concretas que representem colees e que faam uso
de recursos do mecanismo conhecido como Generics. Um exemplo de tipo que implementa esta
interface a classe List<T>: uma lista de elementos em que T pode representar um tipo qualquer.
Classes que implementem IEnumerable<T> devem apresentar em suas definies um mtodo
chamado GetEnumerator. Este ltimo retornar um objeto do tipo IEnumerator<T>, por meio
do qual construes que usem foreach sero capazes de se mover sequencialmente (iterar)
atravs dos elementos que compem a coleo em questo. Logo, a utilizao da instruo
foreach contribui, nestes casos, para ocultar toda a complexidade que estaria envolvida na
manipulao de uma coleo genrica.
A interface IEnumerable<T> conta ainda com diversos mtodos que permitem que se
empregue LINQ na manipulao de agrupamentos de objetos. Exemplos disto so as operaes
Where, OrderBy, Max, Min, Average, dentre outras.
O uso de IEnumerable<T> representa uma boa prtica de desenvolvimento, na qual se privilegia
o uso de interfaces. Com isto, outras estruturas que acessem tais declaraes independem de
aspectos especficos das classes concretas que implementam IEnumerable<T>.

J a Listagem 6 corresponde implementao do tipo Titulos


AReceberDAL, o qual usado na manipulao de informaes,
envolvendo ttulos a receber / boletos originrios de arquivos
processados via workflow. Esta classe tambm faz uso de BaseDAL
para o acesso ao banco de dados de testes.

Listagem 4. Classes de mapeamento


public class TituloAReceberMap :
ClassMap<TituloAReceber>
{
public TituloAReceberMap()
{
Table(TB_TITULO_RECEBER);
Id(p => p.Id);
Map(p => p.IdContaCedente);
Map(p => p.DtEmissao);
Map(p => p.DtVencimento);
Map(p => p.CdDocumento);
Map(p => p.CPFCNPJSacado);
Map(p => p.NomeSacado);
Map(p => p.VlCobranca);
Map(p => p.VlMultaDiaria);
}
}

...
using FluentNHibernate.Mapping;
using TesteWorkflow.Domain.Models;
namespace TesteWorkflow.DataAccess.Mappings
{
public class ArquivoProcessamentoMap :
ClassMap<ArquivoProcessamento>
{
public ArquivoProcessamentoMap()
{
Table(TB_ARQUIVO_PROCESSAMENTO);
Id(p => p.Id);
Map(p => p.DsCaminhoArquivo);
Map(p => p.DtRecebimentoArquivo);
Map(p => p.CdStatus);
Map(p => p.DtProcessamentoArquivo);
}
}

public class DetalhamentoStatusArquivoMap :


ClassMap<DetalhamentoStatusArquivo>
{
public DetalhamentoStatusArquivoMap()
{
Table(VW_DETALHAMENTO_STATUS_ARQUIVO);
Id(p => p.Id);
Map(p => p.DsCaminhoArquivo);
Map(p => p.DtRecebimentoArquivo);
Map(p => p.CdStatus);
Map(p => p.DsStatus);
Map(p => p.DtProcessamentoArquivo);
}
}

public class InconsistenciaArquivoMap :


ClassMap<InconsistenciaArquivo>
{
public InconsistenciaArquivoMap()
{
Table(TB_INCONSISTENCIA_ARQUIVO);
Id(p => p.Id);
Map(p => p.IdArquivo);
Map(p => p.DsProblema);
}
}
}

Edio 93 .NET Magazine

13

Workflow Foundation

Na Class Library TesteWorkflow.Business esto sendo implementadas as classes responsveis por acessar a camada de acesso a dados e que podem conter regras de negcio em suas definies:
ProcessamentoArquivosBO;
TitulosAReceberBO.
O tipo ProcessamentoArquivosBO (Listagem 7) utilizado na
manipulao de informaes referentes a arquivos que sero

processados pelo workflow, fazendo uso da classe de acesso a


dados ProcessamentoArquivosDAL.
J a Listagem 8 apresenta a implementao para a classe
TitulosAReceberBO, responsvel por efetuar operaes de
consulta, incluso e checagem da existncia de ttulos a receber/boletos na base de dados de testes (para isto, emprega-se
o tipo TitulosAReceberDAL para o acesso s estruturas do
banco SQL Server).

Listagem 5. Classe ProcessamentoArquivosDAL


...
using NHibernate;
using NHibernate.Criterion;
using TesteWorkflow.DataAccess.Base;
using TesteWorkflow.Domain.Models;
namespace TesteWorkflow.DataAccess
{
public class ProcessamentoArquivosDAL
{
public IEnumerable<ArquivoProcessamento>
ListarArquivosAguardandoProcessamento()
{
using (var session = BaseDAL.CreateSession())
{
return session.CreateCriteria<ArquivoProcessamento>()
.Add(Expression.Eq(CdStatus, 1))
.AddOrder(Order.Asc(Id))
.List<ArquivoProcessamento>();
}
}
public bool ChecarExistenciaContaCedente(
string cdCedente,
string cdBanco,
string cdAgencia,
string cdContaCorrente)
{
using (var session = BaseDAL.CreateSession())
{
return (session.CreateSQLQuery(
SELECT COUNT(1) FROM TB_CONTA_CEDENTE +
WHERE CdCedente = ? AND CdBanco = ? AND +
CdAgencia = ? AND CdContaCorrente = ?)
.SetString(0, cdCedente)
.SetString(1, cdBanco)
.SetString(2, cdAgencia)
.SetString(3, cdContaCorrente)
.UniqueResult<int>() > 0);
}
}
public int ObterIdContaCedente(
string cdCedente,
string cdBanco,
string cdAgencia,
string cdContaCorrente)
{
using (var session = BaseDAL.CreateSession())
{
return session.CreateSQLQuery(
SELECT Id FROM TB_CONTA_CEDENTE +
WHERE CdCedente = ? AND CdBanco = ? AND +
CdAgencia = ? AND CdContaCorrente = ?)
.SetString(0, cdCedente)
.SetString(1, cdBanco)
.SetString(2, cdAgencia)
.SetString(3, cdContaCorrente)

14 .NET Magazine Edio 93

.UniqueResult<int>();
}
}
public void AtualizarInformacoesArquivo(
ArquivoProcessamento arquivo)
{
using (var session = BaseDAL.CreateSession())
{
session.Update(arquivo);
session.Flush();
}
}
public IEnumerable<DetalhamentoStatusArquivo>
ListarStatusProcessamentoArquivos()
{
using (var session = BaseDAL.CreateSession())
{
return session.CreateCriteria<DetalhamentoStatusArquivo>()
.AddOrder(Order.Desc(DtRecebimentoArquivo))
.AddOrder(Order.Asc(Id))
.List<DetalhamentoStatusArquivo>();
}
}
public DetalhamentoStatusArquivo ObterStatusProcessamentoArquivo(
int idArquivo)
{
using (var session = BaseDAL.CreateSession())
{
return session.CreateCriteria<DetalhamentoStatusArquivo>()
.Add(Expression.Eq(Id, idArquivo))
.UniqueResult<DetalhamentoStatusArquivo>();
}
}
public void IncluirInconsistenciaArquivo(
InconsistenciaArquivo inconsistencia)
{
using (var session = BaseDAL.CreateSession())
{
session.Save(inconsistencia);
session.Flush();
}
}
public IEnumerable<InconsistenciaArquivo> ListarInconsistenciasArquivo(
int idArquivo)
{
using (var session = BaseDAL.CreateSession())
{
return session.CreateCriteria<InconsistenciaArquivo>()
.Add(Expression.Eq(IdArquivo, idArquivo))
.AddOrder(Order.Asc(Id))
.List<InconsistenciaArquivo>();
}
}
}
}

TesteWorkflow.Files uma Class Library em que se encontram


definidas:
Uma classe bsica que ser herdada pelos demais tipos que correspondem a registros de um arquivo: RegistroArquivoTexto;
Classes que equivalem aos diferentes tipos de registro de um
arquivo: HeaderArquivoBoletos, DetalheArquivoBoletos e FooterArquivoBoletos;
Um tipo cujas instncias equivalem representao em memria de um arquivo j carregado e pronto para ser validado:
DadosArquivoBoletos;
Um tipo esttico que contm extension methods empregados na
manipulao de arquivos-texto: StringExtensions;
Uma classe para a leitura das diversas linhas que compem um
arquivo, retornando os objetivos correspondentes a cada registro
encontrado: ArquivoBoletosReader.

Listagem 6. Classe TitulosAReceberDAL


...
using NHibernate;
using NHibernate.Criterion;
using TesteWorkflow.DataAccess.Base;
using TesteWorkflow.Domain.Models;
namespace TesteWorkflow.DataAccess
{
public class TitulosAReceberDAL
{
public bool ChecarExistenciaTitulo(
int idContaCedente, string cdDocumento)
{
using (var session = BaseDAL.CreateSession())
{
return (session.CreateSQLQuery(
SELECT COUNT(1) FROM TB_TITULO_RECEBER +
WHERE IdContaCedente = ? AND CdDocumento = ?)
.SetInt32(0, idContaCedente)
.SetString(1, cdDocumento)
.UniqueResult<int>() > 0);
}
}

Listagem 7. Classe ProcessamentoArquivosBO


...
using TesteWorkflow.Domain.Models;
using TesteWorkflow.DataAccess;
namespace TesteWorkflow.Business
{
public class ProcessamentoArquivosBO
{
private ProcessamentoArquivosDAL _DAL =
new ProcessamentoArquivosDAL();
public IEnumerable<ArquivoProcessamento>
ListarArquivosAguardandoProcessamento()
{
return _DAL.ListarArquivosAguardandoProcessamento();
}
public bool ChecarExistenciaContaCedente(
string cdCedente,
string cdBanco,
string cdAgencia,
string cdContaCorrente)
{
return _DAL.ChecarExistenciaContaCedente(
cdCedente, cdBanco, cdAgencia, cdContaCorrente);
}
public int ObterIdContaCedente(
string cdCedente,
string cdBanco,
string cdAgencia,
string cdContaCorrente)
{
return _DAL.ObterIdContaCedente(
cdCedente, cdBanco, cdAgencia, cdContaCorrente);
}
public void AtualizarInformacoesArquivo(
ArquivoProcessamento arquivo)
{
_DAL.AtualizarInformacoesArquivo(arquivo);
}
public IEnumerable<DetalhamentoStatusArquivo>
ListarStatusProcessamentoArquivos()
{
return _DAL.ListarStatusProcessamentoArquivos();
}
public DetalhamentoStatusArquivo ObterStatusProcessamentoArquivo(
int idArquivo)
{
return _DAL.ObterStatusProcessamentoArquivo(idArquivo);
}
public void IncluirInconsistenciaArquivo(
InconsistenciaArquivo inconsistencia)
{
if (inconsistencia.DsProblema != null &&
inconsistencia.DsProblema.Length > 2000)
{
inconsistencia.DsProblema =
inconsistencia.DsProblema.Substring(0, 2000);
}
_DAL.IncluirInconsistenciaArquivo(inconsistencia);
}
public IEnumerable<InconsistenciaArquivo> ListarInconsistenciasArquivo(
int idArquivo)
{
return _DAL.ListarInconsistenciasArquivo(idArquivo);
}

public void IncluirTituloAReceber(TituloAReceber titulo)


{
using (var session = BaseDAL.CreateSession())
{
session.Save(titulo);
session.Flush();
}
}
public IEnumerable<TituloAReceber> ListarTitulosImportados()
{
using (var session = BaseDAL.CreateSession())
{
return session.CreateCriteria<TituloAReceber>()
.AddOrder(Order.Desc(DtEmissao))
.AddOrder(Order.Asc(CdDocumento))
.List<TituloAReceber>();
}
}
}
}

}
}

Edio 93 .NET Magazine

15

Workflow Foundation

Na Listagem 9 est a especificao do tipo RegistroArquivoTexto,


no qual abstrato e ser implementando pelas demais classes que
equivalem a registros do arquivo-texto, empregado na construo
do exemplo. A propriedade TipoRegistro tambm abstrata e
dever ser implementada nos tipos concretos que herdarem de
RegistroArquivoTexto.

propriedades referentes ao header (tipo HeaderArquivoBoletos), aos


registros de detalhe (uma lista de instncias da classe DetalheArquivoBoletos) e ao footer (tipo FooterArquivoBoletos).
Listagem 10. Classes HeaderArquivoBoletos, DetalheArquivoBoletos e FooterArquivoBoletos
...

Listagem 8. Classe TitulosAReceberBO


...
using TesteWorkflow.Domain.Models;
using TesteWorkflow.DataAccess;
namespace TesteWorkflow.Business
{
public class TitulosAReceberBO
{
private TitulosAReceberDAL _DAL = new TitulosAReceberDAL();

using TesteWorkflow.Files.Base;
namespace TesteWorkflow.Files
{
public class HeaderArquivoBoletos : RegistroArquivoTexto
{
public override string TipoRegistro
{
get { return 0; }
}
public string CNPJ { get; set; }
public string RazaoCedente { get; set; }
public DateTime DtEmissaoBoletos { get; set; }
public string CdCedente { get; set; }
public string CdBanco { get; set; }
public string CdAgencia { get; set; }
public string CdContaCorrente { get; set; }

public bool ChecarExistenciaTitulo(


int idContaCedente, string cdDocumento)
{
return _DAL.ChecarExistenciaTitulo(
idContaCedente, cdDocumento);
}

}
public class DetalheArquivoBoletos : RegistroArquivoTexto
{
public override string TipoRegistro
{
get { return 1; }
}

public void IncluirTituloAReceber(TituloAReceber titulo)


{
_DAL.IncluirTituloAReceber(titulo);
}
public IEnumerable<TituloAReceber> ListarTitulosImportados()
{
return _DAL.ListarTitulosImportados();
}

public string CPFCNPJSacado { get; set; }


public string NomeSacado { get; set; }
public DateTime DtVencimento { get; set; }
public string CdDocumento { get; set; }
public decimal VlCobranca { get; set; }
public decimal VlMultaDiaria { get; set; }

}
}
Listagem 9. Classe RegistroArquivoTexto

...

public class FooterArquivoBoletos : RegistroArquivoTexto


{
public override string TipoRegistro
{
get { return 9; }
}

namespace TesteWorkflow.Files.Base
{
public abstract class RegistroArquivoTexto
{
public abstract string TipoRegistro { get; }
public int NumeroLinha { get; set; }
}
}

NumeroLinha representa o nmero de linha para o registro


dentro do arquivo-texto.
J a Listagem 10 apresenta as definies para as classes Header
ArquivoBoletos, DetalheArquivoBoletos e FooterArquivoBoletos.
Estes tipos herdam a classe bsica RegistroArquivoTexto, com suas
propriedades equivalendo aos diferentes campos que constituem
cada registro existente em um arquivo-texto. A propriedade TipoRegistro foi sobrecarregada em cada uma das classes, de maneira
que retorne o cdigo do tipo de registro correspondente.
DadosArquivoBoletos (Listagem 11) uma classe empregada
para representar um arquivo-texto como um objeto, contando com

16 .NET Magazine Edio 93

public int QtRegistros { get; set; }


}
}

A classe esttica StringExtensions (Listagem 12) disponibiliza


extensions methods que quando aplicados sobre uma string que
represente uma linha e recebendo como parmetros uma posio
inicial e outra final, retornam valores referentes a campos texto
(GetValorStringCampo), de data (GetValorDateTimeCampo),
numricos inteiros (GetValorInt32Campo) e monetrios com
duas casas decimais (GetValorMonetarioCampo). A utilizao
desta tcnica (extension methods) tem por objetivo, conforme
ser demonstrado a seguir, simplificar o cdigo empregado na
manipulao de informaes situadas em diferentes posies das
linhas que constituem um arquivo-texto.

Listagem 11. Classe DadosArquivoBoletos


public List<DetalheArquivoBoletos> RegistrosDetalhe
{
get { return _registrosDetalhe; }
}

...
namespace TesteWorkflow.Files
{
public class DadosArquivoBoletos
{
private HeaderArquivoBoletos _header;

private FooterArquivoBoletos _footer;


public FooterArquivoBoletos Footer
{
get { return _footer; }
set { _footer = value; }
}

public HeaderArquivoBoletos Header


{
get { return _header; }
set { _header = value; }
}

}
}

private List<DetalheArquivoBoletos> _registrosDetalhe =


new List<DetalheArquivoBoletos>();

Listagem 12. Classe StringExtensions


...

this String linha,


int posicaoInicial,
int posicaoFinal)

using System.Threading;
{

string strValorCampo = linha.GetValorStringCampo(


posicaoInicial, posicaoFinal);

namespace TesteWorkflow.Files.Base
{
internal static class StringExtensions
{
public static String GetValorStringCampo(
this String linha,
int posicaoInicial,
int posicaoFinal)
{
int startIndex = posicaoInicial - 1;
return linha.Substring(
startIndex,
posicaoFinal - startIndex).Trim();
}

try
{
return Convert.ToInt32(strValorCampo);
}
catch
{
throw new Exception(String.Format(
O texto compreendido entre as posies {0} e {1} +
no representa um nmero inteiro.,
posicaoInicial, posicaoFinal));
}
}

public static DateTime GetValorDateTimeCampo(


this String linha,
int posicaoInicial,
int posicaoFinal)
{
string strValorCampo = linha.GetValorStringCampo(
posicaoInicial, posicaoFinal);

public static decimal GetValorMonetarioCampo(


this String linha,
int posicaoInicial,
int posicaoFinal)
{
string strValorCampo = linha.GetValorStringCampo(
posicaoInicial, posicaoFinal);

try
{
return new DateTime(
Convert.ToInt32(strValorCampo.Substring(0, 4)),
Convert.ToInt32(strValorCampo.Substring(4, 2)),
Convert.ToInt32(strValorCampo.Substring(6, 2)));
}
catch
{
throw new Exception(String.Format(
O texto compreendido entre as posies {0} e {1} +
no representa uma data vlida.,
posicaoInicial, posicaoFinal));
}

try
{
return Convert.ToDecimal(strValorCampo.Insert(13,
Thread.CurrentThread.CurrentCulture
.NumberFormat.NumberDecimalSeparator));
}
catch
{
throw new Exception(String.Format(
O texto compreendido entre as posies {0} e {1} +
no representa um valor monetrio.,
posicaoInicial, posicaoFinal));
}

}
}

public static int GetValorInt32Campo(

Edio 93 .NET Magazine

17

Workflow Foundation

Nota do DevMan
Extension method um tipo de construo que permite a um mtodo ser adicionado (ao
menos logicamente) s definies de um tipo, sem que este precise ser alterado e que uma
nova classe derivada do mesmo seja criada, ou ainda, que se precise recompilar o tipo original
em questo.
Em termos prticos, extension methods so mtodos estticos que recebem primeiro uma
instncia do tipo que iro estender, esta ltima precedida pela palavra-chave this. Outros
parmetros podem tambm estar presentes, alm do que um extension method pode produzir
como retorno qualquer tipo vlido dentro da plataforma .NET. Para efeitos de desenvolvimento,
no existem diferenas entre se invocar um mtodo convencional e um extension method.
LINQ um exemplo de recurso do .NET framework que faz um uso significativo deste tipo de
mecanismo, disponibilizando uma srie de funcionalidades adicionais que podem ser aplicadas
sobre colees de objetos.

Na Listagem 13 encontra-se a implementao do tipo Arquivo


BoletosReader. Atravs do mtodo GetDadosArquivoBoletos,
esta classe efetua a leitura de um arquivo texto por meio de uma
instncia da classe StreamReader, analisa cada linha verificando
se o contedo da mesma valido (em caso negativo, uma exceo
gerada) e por fim, converte os valores referentes a cada campo
de um registro e, associa os mesmos s propriedades de instncias dos tipos HeaderArquivoBoletos, DetalheArquivoBoletos e
FooterArquivoBoletos. O retorno de GetDadosArquivoBoletos
um objeto da classe DadosArquivoBoletos, a qual agrupar as
instncias das classes que correspondem aos diversos tipos de
registros de um arquivo. Importante mencionar que dentro de
ArquivoBoletosReader que acontece o uso dos extension methods
definidos em StringExtensions.
TesteWorkflow.Process uma aplicao do tipo Workflow
Console Application na qual esto definidas:
Atividades customizadas criadas a fim de possibilitar a construo do workflow de exemplo: ObterArquivosAProcessarActivity
e ProcessarArquivoActivity;
O workflow que implementa a lgica de negcio do processo: representado nesta situao pelo arquivo ImportacaoBoletosWF.xaml;
A classe que possibilita a execuo da aplicao console e que
invocar o workflow: Program.
A classe ProcessarArquivoActivity (Listagem 14) uma atividade customizada que tem por funo, validar os dados de um
arquivo-texto e se os mesmos forem consistentes, carregar as
informaes de boletos encontrados na base de dados.
Para se implementar uma atividade customizada deve ser definida um nova classe que herde o tipo CodeActivity. No caso de
ProcessarArquivoActivity, est sendo utilizada uma verso da
classe base que faz uso de Generics: CodeActivity<T>. T neste
caso pode ser qualquer tipo vlido do .NET framework, sendo
que nesta atividade esse parmetro foi definido como sendo
um valor do enum StatusProcessamentoArquivo (que indicar
se um arquivo invlido, se foi processado normalmente ou,
se a carga das informaes ocorreu parcialmente devido a inconsistncias).

18 .NET Magazine Edio 93

A propriedade InArquivoAProcessar representa um argumento


de entrada a ser manipulado pelo tipo ProcessarArquivoActivity.
Argumentos permitem a passagem de dados para a execuo de
uma determinada atividade at a obteno de valores processados
internamente por esta ltima. Este recurso pode ser usado tanto
com tipos primitivos quanto complexos (formados a partir da
combinao de outros tipos como classes, por exemplo). A configurao de um argumento (associao/binding a uma varivel
ou valor) feita por meio da janela Properties do Visual Studio
durante a modelagem grfica do workflow.
Quando se tratar de um argumento de entrada, o parmetro
informado a uma atividade pode tanto ser uma varivel, quanto
uma expresso. Nesta situao a propriedade que representa tal
argumento dever ser do tipo genrico InArgument<T>, em que
T corresponde ao tipo do valor a ser informado como dado de
entrada atividade em questo.
J no caso de um argumento de sada, deve-se associar ao
mesmo uma varivel. A implementao de propriedades que
correspondam a argumentos de sada acontece utilizando-se o
tipo OutArgument<T>; T neste caso deve ser do mesmo tipo que
a varivel para a qual sero retornadas informaes.
Existe tambm a possibilidade de que um argumento possa ser
tanto de entrada, quanto de sada. Em situaes nas quais isto se
fizer necessrio, devero ser criadas propriedades do tipo genrico
InOutArgument<T>.
atravs da sobrecarga do mtodo Execute (declarado em
CodeActivity<T>) que se define, via cdigo .NET, o que ser executado pela atividade customizada quando a mesma for acionada.
Como est sendo empregada a verso genrica do tipo CodeActivity, o retorno de Execute dever ser o mesmo tipo utilizado
como parmetro na declarao de herana da classe bsica. No
caso especificou-se o retorno em questo que seria um dos valores
possveis para o enum StatusProcessamentoArquivo.
Continuando a analisar o mtodo Execute, percebe-se que o
mesmo, recebe como parmetro de entrada uma instncia do tipo
CodeActivityContext. Esta classe de contexto (CodeActivityContext) representa o ambiente de execuo de uma atividade customizada, sendo o meio a partir do qual se conseguiro manipular
valores associados a argumentos de entrada e/ou sada.
A primeira instruo dentro de Execute invoca o mtodo
Get a partir do objeto associado propriedade InArquivo
AProcessar. Tal mtodo oriundo da implementao da classe
genrica InArgument, recebendo como parmetro um objeto
de contexto do tipo CodeActivityContext e retornando o valor
correspondente: neste exemplo trata-se de uma instncia do
tipo ArquivoProcessamento (obtida durante o processamento
do workflow).
As classes de negcio ProcessamentoArquivosBO e TitulosAReceberBO esto sendo utilizadas ao longo do processamento
do mtodo Execute. As mesmas so empregadas tanto com o
propsito de validao, quanto em operaes de atualizao do
status de arquivos, incluso de novos ttulos a receber, at possveis inconsistncias na base de dados.

Listagem 13. Classe ArquivoBoletosReader


private HeaderArquivoBoletos GetHeader()
{
if (_numeroLinhaAtual != 1)
{
throw new Exception(
Um registro do tipo Header deve ser a primeira linha do arquivo.);
}
HeaderArquivoBoletos header = new HeaderArquivoBoletos();
header.NumeroLinha = _numeroLinhaAtual;
header.CNPJ = _linhaAtual.
GetValorStringCampo(2, 15);
header.RazaoCedente = _linhaAtual.
GetValorStringCampo(16, 65);
header.DtEmissaoBoletos = _linhaAtual.
GetValorDateTimeCampo(66, 73);
header.CdCedente = _linhaAtual.
GetValorStringCampo(74, 80);
header.CdBanco = _linhaAtual.
GetValorStringCampo(131, 135);
header.CdAgencia = _linhaAtual.
GetValorStringCampo(136, 140);
header.CdContaCorrente = _linhaAtual.
GetValorStringCampo(141, 150);

...
using System.IO;
using TesteWorkflow.Files.Base;
namespace TesteWorkflow.Files
{
public class ArquivoBoletosReader
{
private StreamReader _reader;
private string _linhaAtual;
private int _numeroLinhaAtual = 0;
public int NumeroLinhaAtual
{
get { return _numeroLinhaAtual; }
set { _numeroLinhaAtual = value; }
}
public DadosArquivoBoletos GetDadosArquivoBoletos(
string caminhoArquivo)
{
DadosArquivoBoletos arquivoBoletos = new DadosArquivoBoletos();
string tipoRegistroAtual;
using (_reader = new StreamReader(caminhoArquivo))
{
try
{
while (!_reader.EndOfStream)
{
_numeroLinhaAtual++;
_linhaAtual = _reader.ReadLine();
if (_linhaAtual.Length != 150)
{
throw new Exception(
Uma linha representando um registro deve possuir 150 caracteres.);
}

return header;
}
private DetalheArquivoBoletos GetRegistroDetalhe()
{
if (_numeroLinhaAtual == 1)
{
throw new Exception(
Um registro do tipo Header deve ser a primeira linha do arquivo.);
}
if (_reader.EndOfStream)
{
throw new Exception(
Um registro do tipo Footer deve ser a ltima linha do arquivo.);
}
DetalheArquivoBoletos detalhe = new DetalheArquivoBoletos();
detalhe.NumeroLinha = _numeroLinhaAtual;
detalhe.CPFCNPJSacado = _linhaAtual.
GetValorStringCampo(2, 15);
detalhe.NomeSacado = _linhaAtual.
GetValorStringCampo(16, 65);
detalhe.DtVencimento = _linhaAtual.
GetValorDateTimeCampo(66, 73);
detalhe.CdDocumento = _linhaAtual.
GetValorStringCampo(74, 88);
detalhe.VlCobranca = _linhaAtual.
GetValorMonetarioCampo(121, 135);
detalhe.VlMultaDiaria = _linhaAtual.
GetValorMonetarioCampo(136, 150);
return detalhe;
}
private FooterArquivoBoletos GetFooter()
{
if (!_reader.EndOfStream)
{
throw new Exception(
Um registro do tipo Footer deve ser a ltima linha do arquivo.);
}

tipoRegistroAtual = _linhaAtual.Substring(0, 1);


switch (tipoRegistroAtual)
{
case 0:
arquivoBoletos.Header = GetHeader();
break;
case 1:
arquivoBoletos.RegistrosDetalhe.Add(
GetRegistroDetalhe());
break;
case 9:
arquivoBoletos.Footer = GetFooter();
break;
default:
throw new Exception(
Tipo de registro invlido.);
}
}
}
catch (Exception ex)
{
throw new Exception(String.Format(
Erro durante a leitura da linha {0}: {1},
_numeroLinhaAtual, ex.Message));
}
finally
{
_reader.Close();
}

FooterArquivoBoletos footer = new FooterArquivoBoletos();


footer.NumeroLinha = _numeroLinhaAtual;
footer.QtRegistros = _linhaAtual.GetValorInt32Campo(146, 150);
return footer;

}
}

return arquivoBoletos;
}

Edio 93 .NET Magazine

19

Workflow Foundation

Listagem 14. Classe ProcessarArquivoActivity


...

throw new Exception(


A data de emisso dos boletos deve ser igual ou inferior data atual.);

using System.Activities;
using System.IO;
using System.Text.RegularExpressions;
using TesteWorkflow.Process;
using TesteWorkflow.Domain.Models;
using TesteWorkflow.Domain.Models.Enums;
using TesteWorkflow.Business;
using TesteWorkflow.Files;

}
if (_dadosArquivo.RegistrosDetalhe.Count == 0)
{
throw new Exception(
obrigatrio que um arquivo a ser processado possua registros de detalhe.);
}
if (_dadosArquivo.Footer.QtRegistros !=
_dadosArquivo.RegistrosDetalhe.Count + 2)
{
throw new Exception(
A quantidade de registros especificada no registro de tipo Footer +
no coincide com o nmero de linhas do arquivo.);
}

namespace TesteWorkflow.Process.Activities
{
public sealed class ProcessarArquivoActivity :
CodeActivity<StatusProcessamentoArquivo>
{
private ArquivoProcessamento _arquivo;
private ProcessamentoArquivosBO _processamentoArquivosBO;
private TitulosAReceberBO _titulosAReceberBO;
private DadosArquivoBoletos _dadosArquivo;
private int _idContaCedente;

if (!_processamentoArquivosBO.ChecarExistenciaContaCedente(
_dadosArquivo.Header.CdCedente,
_dadosArquivo.Header.CdBanco,
_dadosArquivo.Header.CdAgencia,
_dadosArquivo.Header.CdContaCorrente))
{
throw new Exception(A conta cedente indicada no arquivo no consta +
na base de dados.);
}

public InArgument<ArquivoProcessamento> InArquivoAProcessar


{ get; set; }
protected override StatusProcessamentoArquivo Execute(
CodeActivityContext context)
{
_arquivo = InArquivoAProcessar.Get(context);
_processamentoArquivosBO = new ProcessamentoArquivosBO();
_titulosAReceberBO = new TitulosAReceberBO();
try
{
CarregarArquivo();
AnalisarValidadeArquivo();
}
catch (Exception ex)
{
RegistrarInconsistencia(ex.Message);
AtualizarStatusProcessamentoArquivo(
StatusProcessamentoArquivo.ArquivoInvalido);
return StatusProcessamentoArquivo.ArquivoInvalido;
}

}
private StatusProcessamentoArquivo ProcessarRegistrosDetalhe()
{
int qtdInconsistencias = 0;
_idContaCedente = _processamentoArquivosBO.ObterIdContaCedente(
_dadosArquivo.Header.CdCedente,
_dadosArquivo.Header.CdBanco,
_dadosArquivo.Header.CdAgencia,
_dadosArquivo.Header.CdContaCorrente);
foreach (DetalheArquivoBoletos detalhe in
_dadosArquivo.RegistrosDetalhe)
{
try
{
AnalisarValidadeRegistro(detalhe);
RegistrarTituloAReceber(detalhe);
}
catch (Exception ex)
{
qtdInconsistencias++;
RegistrarInconsistencia(String.Format(
Inconsistncia na linha {0}: {1},
detalhe.NumeroLinha, ex.Message));
}
}

StatusProcessamentoArquivo status =
ProcessarRegistrosDetalhe();
AtualizarStatusProcessamentoArquivo(status);
return status;
}
private void CarregarArquivo()
{
if (!File.Exists(_arquivo.DsCaminhoArquivo))
{
throw new Exception(String.Format(
No foi possvel encontrar o arquivo {0} .,
_arquivo.DsCaminhoArquivo));
}
_dadosArquivo = new ArquivoBoletosReader()
.GetDadosArquivoBoletos(_arquivo.DsCaminhoArquivo);
}
private void AnalisarValidadeArquivo()
{
if (_dadosArquivo.Header.DtEmissaoBoletos > DateTime.Now.Date)
{

20 .NET Magazine Edio 93

if (qtdInconsistencias == 0)
return StatusProcessamentoArquivo
.ProcessadoNormalmente;
else
return StatusProcessamentoArquivo
.ProcessadoComInconsistencias;
}
private void AnalisarValidadeRegistro(
DetalheArquivoBoletos detalhe)
{
if (!Regex.IsMatch(detalhe.CPFCNPJSacado, @^\d{11}$) &&
!Regex.IsMatch(detalhe.CPFCNPJSacado, @^\d{14}$))
{

Continuao: Listagem 14. Classe ProcessarArquivoActivity


esta conta cedente.);
throw new Exception(
Contedo invlido para o CPF / CNPJ.);

}
}

}
private void RegistrarTituloAReceber(
DetalheArquivoBoletos detalhe)
{
TituloAReceber titulo = new TituloAReceber();
titulo.IdContaCedente = _idContaCedente;
titulo.DtEmissao = _dadosArquivo.Header.DtEmissaoBoletos;
titulo.CPFCNPJSacado = detalhe.CPFCNPJSacado;
titulo.NomeSacado = detalhe.NomeSacado;
titulo.CdDocumento = detalhe.CdDocumento;
titulo.DtVencimento = detalhe.DtVencimento;
titulo.VlCobranca = detalhe.VlCobranca;
titulo.VlMultaDiaria = detalhe.VlMultaDiaria;

if (String.IsNullOrWhiteSpace(detalhe.NomeSacado))
{
throw new Exception(
O nome do sacado no pode estar em branco.);
}
if (detalhe.DtVencimento <
_dadosArquivo.Header.DtEmissaoBoletos)
{
throw new Exception(
A data de vencimento deve ser igual ou superior +
data de emisso dos boletos.);
}

_titulosAReceberBO.IncluirTituloAReceber(titulo);
}

if (detalhe.VlCobranca <= 0)
{
throw new Exception(
O valor de cobrana deve ser maior do que zero.);
}

private void RegistrarInconsistencia(


string descricaoInconsistencia)
{
InconsistenciaArquivo inconsistencia =
new InconsistenciaArquivo();
inconsistencia.IdArquivo = _arquivo.Id;
inconsistencia.DsProblema = descricaoInconsistencia;

if (detalhe.VlMultaDiaria < 0)
{
throw new Exception(
O valor da multa diria deve ser maior ou igual a zero.);
}

_processamentoArquivosBO.IncluirInconsistenciaArquivo(
inconsistencia);
}

if (String.IsNullOrWhiteSpace(detalhe.CdDocumento))
{
throw new Exception(
O cdigo do documento no pode estar em branco.);
}
if (_titulosAReceberBO.ChecarExistenciaTitulo(
_idContaCedente, detalhe.CdDocumento))
{
throw new Exception(
J existe outro ttulo cadastrado na base de dados para +

Na Listagem 15 encontra-se a definio da classe ObterArquivosAProcessarActivity. Trata-se de outra atividade customizada


e que tambm herda do tipo base CodeActivity. A nica diferena
nesta nova situao que no se est empregando a verso de CodeActivity que utiliza o conceito de Generics em sua especificao.
Como consequncia, o mtodo Execute no retornar valor algum,
tendo o retorno do mesmo sido declarado como void.
A atividade ObterArquivosAProcessarActivity possui um argumento de sada chamado OutArquivosAProcessar. Esta estrutura
ser utilizada para que a atividade devolva ao workflow um array
de objetos do tipo ArquivoProcessamento.
J a manipulao do argumento de sada acontece, conforme
pode ser observado na implementao de ObterArquivosAProcessarActivity, por meio do mtodo Set de OutArquivosAProcessar: fornecido a tal argumento um objeto de contexto do tipo
CodeActivityContext, alm de um array de instncias da classe
ArquivoProcessamento.
Por fim, importante mencionar ainda o uso da classe de negcio ProcessamentoArquivosBO por parte de ObterArquivosA

private void AtualizarStatusProcessamentoArquivo(


StatusProcessamentoArquivo status)
{
_arquivo.DtProcessamentoArquivo = DateTime.Now;
_arquivo.CdStatus = Convert.ToInt32(status);
_processamentoArquivosBO.AtualizarInformacoesArquivo(_arquivo);
}
}
}

ProcessarActivity. Isso acontece atravs da invocao do mtodo


ListarArquivosAguardandoProcessamento, tendo este ltimo a
responsabilidade de retornar da base de dados possveis instncias
contendo informaes relativas a arquivos a serem processados.
Nota
Tambm ser necessrio adicionar referncias para as bibliotecas do Fluent NHibernate (incluindo dlls
do framework NHibernate) no projeto TesteWorkflow.Process (assim como foi feito anteriormente
com a Class Library TesteWorkflow.DataAccess).

Na Figura 1 est a representao grfica (arquivo ImportacaoBoletos.xaml) do workflow responsvel por importar boletos de
arquivos enviados por instituies bancrias. Neste modelo j
esto constando as diversas atividades que compem a lgica de
negcio do processo de exemplo.
O processo que est sendo construdo neste artigo ser um
Sequential Workflow. Assim, uma atividade do tipo Sequence
(com sua propriedade DisplayName configurada como Sequence

Edio 93 .NET Magazine

21

Workflow Foundation

Listagem 15. Classe ObterArquivosAProcessarActivity


...
using System.Activities;
using TesteWorkflow.Domain.Models;
using TesteWorkflow.Business;
namespace TesteWorkflow.Process.Activities
{
public sealed class ObterArquivosAProcessarActivity : CodeActivity
{
public OutArgument<ArquivoProcessamento[]> OutArquivosAProcessar
{ get; set; }
protected override void Execute(CodeActivityContext context)
{
ProcessamentoArquivosBO BO = new ProcessamentoArquivosBO();
ArquivoProcessamento[] arquivosAProcessar =
BO.ListarArquivosAguardandoProcessamento().ToArray();
OutArquivosAProcessar.Set(context, arquivosAProcessar);
}
}
}

- Importao de Boletos no diagrama) agrupa as demais atividades do workflow, de maneira que estas ltimas sejam executadas
sequencialmente.
Para o correto funcionamento deste workflow, bem como possibilitar o intercmbio de informaes entre as diferentes atividades
que constituem o mesmo, dever ser definida uma varivel de
nome arquivosAProcessar. O tipo desta ltima (Variable type)
ser um array de objetos ArquivoProcessamento e o escopo ser
preenchido como Sequence - Importao de Boletos (ou seja,
arquivosAProcessar poder ser utilizada em qualquer outro
ponto do workflow).
Variveis possuem dentro de um workflow, um escopo a partir
do qual o uso vlido. Pode-se especificar que tal escopo corresponda a todo o workflow, ou ainda, que a utilizao de uma
varivel seja possvel apenas dentro de um conjunto de atividades
(as quais podem estar agrupadas sob a forma de uma atividade
do tipo Sequence ou Flowchart).
Nota
Ao se abrir o modo grfico de um workflow dentro do Visual Studio exibido uma aba no rodap
chamada Variables. Acessando esta ltima possvel configurar variveis para utilizao dentro
de um workflow.

Figura 1. Representao grfica do workflow de exemplo

22 .NET Magazine Edio 93

A primeira atividade executada pelo workflow do tipo WriteLine (que pertence ao agrupamento de atividades chamadas de
Primitives), sendo utilizada para a exibio de mensagens em
uma aplicao console. Configurou-se a propriedade Text da mesma com a string Iniciando o Processo de Importao de Boletos...
(entre aspas, j que se trata de uma VB expression).
Na sequncia o workflow acionar a atividade ObterArquivosAProcessarActivity, na qual responsvel por retornar arquivos
cujos respectivos contedos ainda encontram-se pendentes de
anlise. Deve-se associar ento propriedade OutArquivosAProcessar desta atividade a varivel arquivosAProcessar j definida
anteriormente.
Uma vez que constem na varivel arquivosAProcessar, informaes dos arquivos cujos dados sero processados, deve-se acessar
cada uma das posies deste array com a finalidade de se proceder
com a validao e se assim for o caso, realizar a posterior incluso
de boletos na base de dados: uma atividade ForEach (a qual faz
parte do agrupamento Control Flow) servir de base para se
alcanar tal objetivo.
A Tabela 4 lista as propriedades da atividade ForEach com o contedo esperado para as mesmas. A propriedade TypeArgument
corresponde ao tipo empregado na manipulao de informaes
sobre arquivos, ao passo que Values toma como base a varivel do
workflow que armazena dados de relaes de boletos recebidas
e ainda pendentes.
Neste momento, ser necessrio incluir uma atividade do tipo
Sequence seo Body da atividade ForEach adicionada anteriormente. Este procedimento visa possibilitar que as diferentes
atividades existentes dentro do loop sejam executadas sequencial-

Propriedade

Valor

DisplayName

ForEach<ArquivoProcessamento>

TypeArgument

TesteWorkflow.Domain.Models.ArquivoProcessamento

Values

arquivosAProcessar

Varivel de controle do Foreach

arquivo

Tabela 4. Propriedades a serem configuradas para a atividade ForEach


mente, respeitando assim a ordem necessria para as diferentes
etapas do processamento de um arquivo. Configurar a propriedade DisplayName desta atividade como Sequence - Processamento de Arquivo. Dentro desta ltima devero ser adicionadas
primeiramente uma atividade WriteLine, prosseguindo com a
incluso de uma atividade do tipo ProcessarArquivoActivity e
por fim, com a insero de uma atividade Switch.
A atividade WriteLine situada dentro de Sequence - Processamento de Arquivo dever ter sua propriedade Text preenchida
com a seguinte expresso: Environment.NewLine + Iniciando
processamento do arquivo + arquivo.DsCaminhoArquivo +
.... Esta instruo indicar que o processamento de um novo
arquivo est sendo iniciado.
Ser preciso agora configurar a atividade ProcessarArquivo
Activity, a qual efetuar a validao e a posterior carga de
informaes de arquivos (se este for o caso). A Tabela 5 lista
as propriedades da atividade ProcessarArquivoActivity com o
contedo a ser definido para as mesmas. A propriedade InArquivoAProcessar ser associada varivel de controle do Foreach (arquivo), ao passo que Result estar vinculada varivel
statusProcessamentoArquivo.

Em todas as clusulas do Switch usado no workflow de exemplo


constar uma atividade do tipo WriteLine, com cada uma destas
ltimas exibindo uma mensagem referente ao resultado do processamento de um arquivo. Como estar sendo avaliado o contedo
da varivel statusProcessamentoArquivo, a Tabela 6 lista possveis valores para a mesma, bem como o texto a ser especificado
na propriedade Text da atividade WriteLine correspondente.
Valor da Clusula Case

Contedo da propriedade Text na atividade


WriteLine associada

ArquivoInvalido

O contedo deste arquivo invlido. Consulte o log do mesmo para obter maiores
detalhes.

ProcessadoComInconsistencias

Este arquivo foi processado, porm com


inconsistncias. Consulte o log do mesmo
para obter maiores detalhes.

ProcessadoNormalmente

Arquivo processado com sucesso.

Tabela 6. Configuraes da atividade Switch


O processo chega sua ltima etapa quando o fluxo alcana
a atividade WriteLine que est situada aps ForEach<Arquivo
Processamento>. Esta atividade deve ter sua propriedade Text
preenchida com a expresso: Environment.NewLine + Termino
do Processo de Importao de Boletos. + Environment.NewLine
+ Digite qualquer tecla para encerrar a aplicao....
A Listagem 16 apresenta o contedo do arquivo app.config da
aplicao TesteWorkflow.Process; j est constando dentro do
mesmo a string de conexo TesteWorkflow, a qual se faz necessria
para a utilizao da base de dados de testes.

Propriedade

Valor

Listagem 16. Arquivo app.config do projeto TesteWorkflow.Process

DisplayName

ProcessarArquivoActivity

InArquivoAProcessar

arquivo

Result

statusProcessamentoArquivo

<?xml version=1.0 encoding=utf-8 ?>


<configuration>
<connectionStrings>
<add name=TesteWorkflow
providerName=System.Data.SqlClient
connectionString=Data Source=.\SQLEXPRESS;Initial Catalog=
TesteWorkflow;Integrated Security=True;MultipleActiveResultSets=True;/>
</connectionStrings>
<startup>
<supportedRuntime version=v4.0 sku=.NETFramework,Version=v4.0,
Profile=Client />
</startup>
</configuration>

Tabela 5. Propriedades a serem configuradas para a atividade ProcessarArquivoActivity


Com a varivel statusProcessamentoArquivo recebendo o resultado da execuo de ProcessarArquivoActivity, deve-se configurar a
atividade Switch, a fim de que com isto se exiba uma mensagem em
tela que indique se o processamento dos dados aconteceu ou no, e
em caso afirmativo, se ocorreram ainda quaisquer tipos de inconsistncias. Preencher o contedo da propriedade Expression desta
atividade com o valor statusProcessamentoArquivo (sem aspas), a
fim de que se verifique o resultado do processamento de um arquivo
a partir da varivel definida anteriormente para este fim.
Uma atividade do tipo Switch possui um funcionamento anlogo
ao da instruo de mesmo nome e que est presente em muitas
linguagens de programao convencionais. Cada um dos valores a
serem avaliados por Switch<StatusProcessamentoArquivo> dever ser especificado numa clusula Case. Se o valor da expresso
definida para a atividade coincidir com o que consta em alguma
clusula, a atividade associada a esta ltima ser executada.

J na Listagem 17 est o cdigo-fonte da classe Program, a qual


serve de base para a ativao da aplicao TesteWorkflow.Process.
Atravs do mtodo Invoke da classe WorkflowInvoker possvel
iniciar a execuo de um workflow, fornecendo para isto uma instncia da classe que corresponde ao processo a ser executado.
Atravs da aplicao MVC TesteWork f low.UI.Consulta
Importacoes ser possvel a consulta do status em que se encontra
o processamento de arquivos enviados por instituies bancrias,
bem como de provveis inconsistncias e, mesmo de boletos que
j foram importados.

Edio 93 .NET Magazine

23

Workflow Foundation

Na Listagem 18 encontra-se a definio do Controller Home, sendo responsabilidade desta estrutura o processamento dos dados
necessrios aos diferentes tipos de consultas aqui citados.
Listagem 17. Classe Program
...
using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;
namespace TesteWorkflow.Process
{
class Program
{
static void Main(string[] args)
{
WorkflowInvoker.Invoke(new ImportacaoBoletosWF());
Console.ReadKey();
}
}
}

Teste do workflow criado


Com a base de dados TesteWorkflow criada, o primeiro passo
a ser executado para o teste da soluo aqui descrita consultar o status dos diferentes arquivos a serem processados. Isto
ser feito por meio da execuo da aplicao TesteWorkflow.
UI.ConsultaImportacoes. A Figura 2 exibe os diversos arquivos
registrados na base de dados, sendo que os mesmos encontram-se
neste primeiro momento como Aguardando processamento.
A execuo da aplicao TesteWorkflow.Process resultar no processamento de 4 arquivos que foram gerados para testes (Figura 3).
A imagem da Figura 4 apresenta o status em que se encontram
agora os arquivos aps este procedimento.

Listagem 18. Classe HomeController


...
using TesteWorkflow.Business;
namespace TesteWorkflow.UI.ConsultaImportacoes.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ProcessamentoArquivosBO bo = new ProcessamentoArquivosBO();
return View(bo.ListarStatusProcessamentoArquivos());
}
public ActionResult ListarInconsistenciasArquivo(int idArquivo)
{
ProcessamentoArquivosBO bo = new ProcessamentoArquivosBO();
ViewBag.StatusArquivo =
bo.ObterStatusProcessamentoArquivo(idArquivo);
return View(bo.ListarInconsistenciasArquivo(idArquivo));
}
public ActionResult ConsultaTitulosImportados()
{
TitulosAReceberBO bo = new TitulosAReceberBO();
return View(bo.ListarTitulosImportados());
}
public ActionResult About()
{
return View();
}
}
}

Nota
Para efeitos de simplificao, o cdigo HTML das diferentes views da aplicao MVC TesteWorkflow.
UI.ConsultaImportacoes foi omitido deste artigo. Estes arquivos podero ser obtidos no material
que est disponvel para download. Alm disso, assim como aconteceu com o arquivo app.config da
Console Application, dever ser acrescentada uma string de conexo de nome TesteWorkflow e que
aponte para a base de dados de testes no Web.config de TesteWorkflow.UI.ConsultaImportacoes.

24 .NET Magazine Edio 93

Figura 2. Consulta a arquivos que ainda no foram processados

Figura 3. Execuo da Console Application que aciona o workflow

Figura 4. Status de arquivos alterados aps execuo do workflow


Nota
A carga dos arquivos para testes foi efetuada considerando que os mesmos se encontravam na pasta
C:\Temp\TesteWorkflow. O script que gera a base de dados tambm partiu desta premissa, ao se
considerar a incluso dos arquivos a serem processados na tabela criada especificamente para este fim.

Ao clicar sobre o link Detalhar da coluna Inconsistncias


do arquivo TesteArquivo3.txt sero listados em tela os problemas
que ocorreram durante a importao (Figura 5).
J quando se acionar a aba Ttulos Importados constaro os
boletos que foram importados durante a execuo do workflow
(Figura 6).

grfica de um fluxo de atividades em um workflow e a partir


disto, da implementao da lgica de negcio associada. Conforme
exposto neste artigo, esta abordagem facilita o desenvolvimento
de solues orientadas a processos, alm do modelo grfico resultante ser mais intuitivo e permitir um melhor entendimento
de todo o contexto associado.

Concluso

Construindo e Gerenciando Processos de Negcios Automatizados


http://technet.microsoft.com/pt-br/library/dd569824.aspx
Extension Methods
http://msdn.microsoft.com/en-us/library/bb383977.aspx
Fluent NHibernate
http://fluentnhibernate.org/
Sequential and Flowchart modeling styles
http://blogs.msdn.com/b/endpoint/archive/2009/06/12/sequential-andflowchart-modeling-styles.aspx
Windows Workflow Foundation
http://msdn.microsoft.com/en-us/netframework/aa663328
D seu feedback sobre esta edio!
A Java Magazine tem que ser feita ao
seu gosto. Para isso, precisamos saber
o que voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:

Feedback
eu
sobre e
s

A busca por uma maior eficincia operacional representa, nos


dias atuais, uma preocupao que assola a maioria das organizaes. Alm disso, a insero de tais companhias em ramos de forte
concorrncia impulsiona a uma procura incessante por evoluo
em suas rotinas cotidianas. Diante do exposto, a automao de
processos por meio de aplicaes de software vista como um
meio de muitas empresas otimizarem seus procedimentos internos, conseguindo com isto uma maior eficcia em atividades
primordiais continuidade das mesmas nos ramos de negcio
em que encontram-se inseridas.
Solues de software convencionais destinadas automao
de processos, contam geralmente com uma estrutura complexa,
sendo esta caracterstica fruto de uma codificao extensa e no
raro, de difcil entendimento. Levando em conta estes aspectos
fcil imaginar que alteraes em projetos deste tipo constituam
tarefas trabalhosas, com as dificuldades se agravando em cenrios
nos quais mudanas em regras de negcio ocorram com certa
regularidade.
A tecnologia Workflow Foundation foi concebida como uma
alternativa para simplificar a construo de aplicaes que automatizem processos. Isto , conseguido por meio da modelagem

A Developers Introduction to Windows Workflow Foundation


(WF) in .NET 4
http://msdn.microsoft.com/en-us/library/ee342461.aspx

D
s

Figura 6. Boletos que foram importados atravs do workflow

edio
ta

Figura 5. Status de arquivos alterados aps execuo do workflow

Renato Jos Groffe


renato.groffe@yahoo.com.br
Atua como consultor em atividades voltadas ao desenvolvimento
de softwares h mais de 10 anos. Bacharel em Sistemas de
Informao, com especializao em Engenharia de Software. Microsoft
Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.
NET, Windows Forms), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD),
ITIL Foundation V2.

www.devmedia.com.br/javamagazine/feedback

Edio 93 .NET Magazine

25

Seo .NET: Nesta seo voc encontra artigos intermedirios sobre as tecnologias .net

Integrao com Google D


Acessando documentos

Resumo DevMan
De que se trata o artigo:
Neste artigo ser demonstrado como acessar documentos presentes no Google Docs utilizando uma
aplicao WEB, por meio das APIs de dados do Google (GData). Sero expostos os conceitos e funes
que envolvem as APIs relacionadas ao Google Docs, incluindo questes relacionadas ao protocolo e
autenticao do servio. Os conceitos abordados sero usados na construo de uma pequena aplicao
cuja funo acessar planilhas presentes em uma determinada conta do Google Docs, utilizando a API
Spreadsheet Data para realizar tal tarefa.

Em que situao o tema til:


Integrar em um aplicativo os servios do Google que so usados por diversas pessoas, at mesmo como
solues empresariais. O Google Docs faz parte desta gama de servios, possibilitando a criao e compartilhamento de documentos com vrios usurios. A integrao deste servio em aplicaes .NET traz novas
possibilidades de desenvolvimento e solues, podendo servir, por exemplo, como um meio de armazenamento de documentos. O conhecimento da biblioteca cliente do .NET e dos recursos disponibilizados
pelas APIs o ponto de partida para o desenvolvedor criar aplicaes que faam uso destes servios.

Integrao com Google Docs:


O artigo comea apresentando a API de dados do Google (GData), passando pelas APIs do Google Docs,
demonstrando seus conceitos, aplicaes, formas de autenticao e o protocolo utilizado na comunicao
entre a aplicao cliente e os servios que fazem parte deste conjunto de bibliotecas. Em seguida, ser
desenvolvida uma aplicao com o objetivo de listar documentos existentes em uma determinada conta
do Google Docs, mais especificamente, documentos do tipo planilha, denominados Spreadsheet, e mostrar
o contedo dos mesmos. Para realizar tal tarefa, ser utilizada a API Spreadsheet Data, que contm classes
e mtodos cuja funo possibilitar o acesso e manipulao dos dados presentes nas planilhas.

Google Docs uma ferramenta


que permite criar documentos
online e compartilhar os mesmos com outros usurios em tempo real.
Este servio vem evoluindo a cada dia,
agregando cada vez mais novas funcionalidades e recursos. Atualmente, alm
da criao de documentos, possvel,
entre outras funcionalidades, a traduo
dos mesmos e at o reconhecimento de
caracteres a partir de imagens, recurso este
conhecido como OCR (Optical Character
Recognition).
Imagine todos esses servios e possibilidades integrados em aplicaes .NET,
sejam elas voltadas para o ambiente web

26 .NET Magazine Edio 93

ou desktop. Essa integrao possvel


graas s APIs de dados do Google, conhecidas como Google Data APIs (GData).
Elas contm classes que possibilitam
acessar e manipular os diversos servios
disponibilizados pelo Google, por exemplo, o Google Calendar, Google Picasa
Web, Google Analytics, Google Maps,
entre outros, por meio de um protocolo
que define as regras para a escrita e
leitura de dados na web. Sendo assim,
possvel criar aplicaes clientes capazes
de acessar toda gama de recursos disponibilizados, dentre eles, documentos
presentes em contas do Google Docs, que
o foco deste artigo.

ocs
Ericksen Viana Sampaio
Google Data API
A API de dados do Google formada por uma srie de bibliotecas que proveem acesso aos diversos servios do Google. Por
exemplo, utilizando o YouTube Data API possvel realizar buscas, fazer upload e download de vdeos. A API Google Calendar
Data possibilita, dentre outros recursos, recuperar eventos em
formato de RSS feed. O GData .NET Client Library a biblioteca
disponibilizada pelo Google para desenvolver aplicaes .NET
que faam uso de suas APIs. Ela tambm est disponvel para
outras linguagens como Java, PHP, Pyton entre outras. Esta biblioteca contm classes que correspondem aos elementos e tipos
utilizados pelas APIs. At o momento da escrita deste artigo, as
APIs relacionadas aos servios do Google Docs se encontram na
verso 3.0 e sero destacadas no prximo tpico.

APIs do Google Docs


A API Google Documents List faz parte das APIs de dados. As
mesmas possibilitam a uma aplicao cliente acessar e manipular
os dados de documentos armazenados no Google Docs, ou seja,
por meio dela possvel interagir com o servio, acessando e manipulando seus diversos recursos. Ela oferece suporte a: criao,
recuperao, alterao e excluso de documentos, alterao das
permisses de compartilhamento, download e upload, cpia de
documentos e pastas, etc.
A API Document List, porm, no permite alterar dados de documentos do tipo planilha, denominados Spreadsheets. Com ela
possvel apenas criar e recuperar documentos deste tipo. Para ser
possvel a manipulao de dados, necessrio utilizar uma API
prpria denominada Spreadsheet Data. Por meio desta possvel
ler os dados das planilhas, percorrendo as clulas e colunas das
mesmas. A API Spreadsheet Data ser utilizada na construo de
uma pequena aplicao ainda neste artigo.
Estas duas APIs contm classes e mtodos que so capazes
de acessar os servios disponibilizados pelo Google Docs.
Dentre elas, podemos destacar as classes DocumentListService
e SpreadsheetService, que correspondem respectivamente aos
documentos e planilhas do Google Docs, provendo acesso a
estes servios. A classe SpreadsheetService ser vista com mais
detalhes adiante.

Protocolo
O API GData possui um protocolo que possibilita a escrita e
leitura de dados nos servios disponveis, conhecido como Google
Data Protocol, baseado na arquitetura REST. O formato padro

deste protocolo o Atom (Feed). O Atom nada mais que um


estilo baseado em contedo XML, muito utilizado na publicao
e edio de fontes WEB.
Muitos servios do Google proveem o acesso externo aos dados
por meio de suas APIs baseadas neste protocolo, que suporta dois
modos de acesso:
AtomPubs: A informao enviada como uma coleo de itens
Atom, usando o formato Atom Syndication, que representa dados
para manipular as requisies. O Data Protocol estende o AtomPubs para processar consultas, autenticao e requisies batch.
JSON: Informaes so enviadas via objetos JSON que espelham
a representao Atom.

Nota do DevMan
Representational State Transfer, ou apenas REST, define um conjunto de princpios de arquitetura pelo
qual voc pode projetar Web Services com foco nos recursos do sistema, incluindo como os estados
destes recursos so endereados e transferidos via HTTP por uma ampla gama de aplicaes clientes,
escritas em diferentes linguagens. Esta arquitetura uma alternativa aos Web Services baseados
no protocolo SOAP (Simple Object Access Protocol) e na linguagem WSDL (Web Service Definition
Language). A implementao de uma soluo REST segue quatro princpios de design:
Utilizam mtodos HTTP explicitamente
Sejam Stateless (protocolo onde cada requisio executada de forma independente).
Expem a estrutura de diretrios como URIs.
Transferem xml, Javascript Object Notation (JSON), ou ambos.

Nota do DevMan
JSON, sigla para JavaScript Object Notation, um formato texto para troca de dados que utiliza a
sintaxe Javascript para descrever os objetos de dados. Diferentemente do XML, que um formato
comparado ao JSON no que se refere a utilizao, os objetos JSON so tipados, possuindo tipos como
string, number boolean e array. Geralmente, o formato JSON utilizado para representar informaes
sobre configuraes e na implementao de protocolos.

Aps a autenticao no Google, o acesso as APIs pode ser feito


via requisies HTTP POST ou GET. Com estas requisies, os
dados so transferidos na forma de Feeds de dados. Cada feed
referente a uma URL. Por exemplo, a url docs.google.com/feeds
refere-se aos feeds dos documentos do usurio, e por meio dele
que feito acesso aos documentos . Um Feed contm um ou mais
elementos Entry, que representam as entradas de dados, ou seja,
os itens presentes no Feed.

Edio 93 .NET Magazine

27

Integrao com Google Docs

O xml a seguir (Listagem 1) apresenta um exemplo de contedo


acessado em uma planilha presente no Google Docs, utilizando
o servio de Spreadsheet.
Listagem 1. Resultado do uso do servio de SpreadSheet
<feed xmlns=http://www.w3.org/2005/Atom xmlns:openSearch=
http://a9.com/-/spec/opensearchrss/1.0/>
<id>https://spreadsheets.google.com/feeds/spreadsheets/private/full</id>
<updated>2011-10-08T13:11:13.142Z</updated>
<category scheme=http://schemas.google.com/spreadsheets/2006 term=
http://schemas.google.com/spreadsheets/2006#spreadsheet/>
<title type=text>Available Spreadsheets</title>
<link rel=alternate type=text/html href=http://docs.google.com/>
<link rel=http://schemas.google.com/g/2005#feed type=application/
atom+xml href=https://spreadsheets.google.com/feeds/spreadsheets/
private/full/>
<link rel=self type=application/atom+xml href=
https://spreadsheets.google.com/feeds/spreadsheets/private/full/>
<openSearch:totalResults>3</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<entry>
<id>https://spreadsheets.google.com/feeds/spreadsheets/private/full/
1sasdhshad</id>
<updated>2011-09-30T18:38:34.304Z</updated>
<category scheme=http://schemas.google.com/spreadsheets/2006
term=http://schemas.google.com/spreadsheets/2006#spreadsheet/>
<title type=text>SpreadsheetTest</title>
<content type=text>SpreadsheetTest</content>
<link rel=http://schemas.google.com/spreadsheets/2006#worksheetsfeed
type=application/atom+xml href=https://spreadsheets.google.com/feeds/
worksheets/1sasdhshad/private/full/>
<link rel=alternate type=text/html href=https://spreadsheets.google.com/
ccc?key=lksjehdndsysbaxkj34/>
<link rel=self type=application/atom+xml href=https://spreadsheets.
google.com/feeds/spreadsheets/private/full/1sasdhshad/>
<author>
<name>Microsoft</name>
<email></email>
</author>
</entry>
</feed>

Veja que ele possui uma tag <feed>, onde esto includas as
demais tags do xml. A tag <entry> est relacionada a um registro do feed, ou seja, aos contedos retornados. Neste caso, cada
tag do tipo <entry> refere-se s planilhas encontradas no feed.
Veja que a entry possui as informaes bsicas do documento,
como ttulo <title>, data de atualizao <updated>, autor <author> e o link <link> que contm a url onde a planilha pode
ser encontrada.
Lembrando que, para acessar um servio do Google em aplicaes .NET, no necessrio escrever cdigos que utilizem
diretamente o protocolo do Google, fazendo parsers em arquivos XML ou consultando objetos JSON. Para isso, conforme j
foi apresentado anteriormente, existem as bibliotecas clientes
(Client Library), que fornecem uma linguagem de mais alto nvel
e conceito para acessar tais servios, de uma forma intuitiva e
orientada a objetos.
As bibliotecas clientes analisam automaticamente o contedo
Atom e colocam os valores dos elementos Atom nos objetos corres-

28 .NET Magazine Edio 93

pondentes. Por exemplo, a biblioteca cliente do .NET disponibiliza


a classe Feed, corresponde ao elemento <feed>. A classe Entry
corresponde ao elemento <entry>, que est relacionado a um Feed.
Deste modo grande parte das tags xml podem ser manipuladas
via objetos, facilitando o trabalho do programador.
Alm disso, as APIs fornecem estruturas para consultar estes
dados, oferecendo condies para se criar filtros utilizando queries
em cima dos contedos retornados. Podem ser obtidos documentos especficos do Google Docs, de acordo com um determinado
ttulo, autor, ou at mesmo, retornar documentos que contenham
certas palavras chave.

Nota do DevMan
Feeds so formatos de dados geralmente baseados em XML, que apresentam contedos resumidos,
cada um contendo um link para a fonte do contedo. uma fonte de dados frequentemente
atualizada, sendo muito utilizado em sites de notcias e blogs.

Aplicao de exemplo
Para ilustrar todo o conceito abordado nos tpicos anteriores, ser desenvolvida uma aplicao WEB que far acesso a
documentos presentes em uma conta do Google Docs, mais
especificamente, documentos do tipo planilhas, denominados
Spreadsheets.
O projeto consiste em uma pgina Web cujo objetivo listar
todas as planilhas que existem em uma determinada conta e,
ao selecionar uma delas, seu contedo mostrado na tela.
Por se tratar de uma aplicao simples, possuindo apenas uma
pgina ASP.NET, no sero demonstrados questes relacionadas a arquitetura de sistemas, com uma estrutura em camadas.
Apenas a camada de Interface ser desenvolvida, contendo uma
classe auxiliar para realizar toda a lgica de acesso aos servios
do Google Docs, denominada Servico.
Antes de iniciar o desenvolvimento do projeto necessrio
baixar a biblioteca cliente do .NET, que pode ser encontrada no
endereo contido na seo Links e posteriormente referencila no projeto. Nem todas as bibliotecas sero utilizadas na
aplicao, uma vez que o foco do projeto o acesso a planilhas
do Google Docs. No transcorrer do desenvolvimento sero
mostrados quais sero necessrias.

A classe Servico
A classe Servicos contm os mtodos responsveis pela autenticao e acesso s planilhas do Google Docs. Para isso ser possvel
necessrio referenciar as seguintes bibliotecas:
Google.GData.Spreadsheet: Contm classes que possibilitam
acessar e manipular dados armazenados em planilhas do Google
Docs (Google Spreadsheet). Vale ressaltar que esta biblioteca no
oferece recursos para a criao de planilhas e o gerenciamento
de suas permisses. Para isso, necessria a utilizao da API
Document List, conforme descrito anteriormente.

Google.GData.Client: Contm classes que oferecem suporte as APIs


do Google para acessar os dados de determinado servio, como, por
exemplo, classes responsveis pela autenticao do usurio.
A Listagem 2 apresenta as primeiras construes desta classe,
definindo um atributo esttico objServico (linha 1) e o mtodo
Instance( linhas 2 a 7) que faz uso desta propriedade. Este mtodo
retorna uma instncia da classe Servico. Observe que foi utilizado
o padro de projeto Singleton nesta contruo.

A propriedade SessionToken tem como nica responsabilidade


obter o valor do token armazenado na varivel de sesso Token
(Listagem 3). Sua utilidade ser demonstrada mais a frente.
A classe tambm define uma propriedade denominada Auth
FactorySheets, do tipo GAuthSubRequestFactory, que uma classe
presente na biblioteca GData.Client e um atributo esttico tambm
de mesmo tipo, conforme Listagem 4.
Listagem 3. Propriedade referente a varivel de sesso Token
1
2
3
4
5
6
7

Listagem 2. Estrutura para instaciar um objeto da classe


1
2
3
4
5
6
7

private static Servico objServico = null;


public static Servico Instance()
{
if (objServico == null)
objServico = new Servico();
return objServico;
}

public string SessionToken


{
get
{
return HttpContext.Current.Session[Token].ToString();
}
}

Listagem 4. Propriedade AuthFactorySheets

Nota
Singleton um padro de projeto de software, includo na categoria de padres criacionais, cujo
objetivo garantir uma instncia nica e acessvel de forma global e uniforme para toda classe que
FairCom101206BRhalffinal.pdf
1
2/9/11
3:19 PM
implemente este padro. Desta forma, este padro garante que o sistema crie apenas um objeto
da classe.

1
2
3
4
5
6
7
8
9
10
11
12
13

private GAuthSubRequestFactory objFactorySheets = null;


private GAuthSubRequestFactory AuthFactorySheets
{
get
{
if (objFactorySheets == null)
{
objFactorySheets = new GAuthSubRequestFactory(wise, AppGoogleDocs);
objFactorySheets.Token = SessionToken;
}
return objFactorySheets;
}
}

SQL E Isam Uma


Combinao De Sucesso!

201

1 Fair
Co

m Co
rporati
on

Deixe o sistema de sua empresa mais leve e rpido. Conhea as


novidades do c-tree e faa toda a diferena!
U ADICIONE processamento de transaes, recuperao automtica,
backups dinmicos e replicao aos seus aplicativos.
U AMPLIE sua escolha de APIs com C, C++, .NET, ODBC, JDBC, PHP e SQL.
U FAA como muitas empresas no mundo todo, lderes em diversos
segmentos como finanas, telecomunicaes e sade, que tm baseado
suas solues crticas na tecnologia c-tree.

the right-size Database


Baixe seu SDK grtis
v>VVUnn
Edio 93 .NET Magazine

29

Integrao com Google Docs

A classe GauthSubRequestFactory contm informaes da


requisio ao servio. Seu construtor recebe dois parmetros
(linha 8):
service: Nome do servio que ser solicitado ao Google. Como
vamos acessar documentos do tipo planilha, utilizando a Spreadsheets Data API, o nome do servio passado deve ser wise
(Outras APIs recebem valores diferentes).
applicationName: O nome da aplicao que estamos utilizando
para fazer acesso ao servio. No caso, o nome da aplicao foi
definida como AppGoogleDocs.
A outra propriedade criada nesta classe a SpreadsheetService,
do tipo SpreadsheetService (Listagem 5). Esta classe responsvel
pela construo de uma conexo com o servio de Spreadsheet
(planilhas) do Google. Seu construtor recebe como parmetro o
nome da aplicao que ir fazer o acesso ao servio (linha 5).
Listagem 5. Propriedade AuthFactorySheets
1 public SpreadsheetsService SpreadsheetService
2
{
3
get
4
{
5
SpreadsheetsService objSpreadsheetService = new
6
SpreadsheetsService(AuthFactorySheets.ApplicationName);
7
objSpreadsheetService.RequestFactory = AuthFactorySheets;
8
return objSpreadsheetService;
9
}
10
}

Na linha 7, a propriedade AuthFactorySheets atribuda


propriedade RequestFactory da classe SpreadsheetService. Sua
responsabilidade gerar os objetos de requisio da API GData
que servem para realizar as operaes de manipulao de dados
do servio solicitado.
Partindo agora para os mtodos da classe, temos o ObtemFeeds(),
que recebe como parmetro opcional o nome de uma determinada
planilha e retorna um objeto do tipo SpreadsheetFeed. Este mtodo exposto na Listagem 6. Um objeto feed nada mais que uma
lista contendo informaes, no caso, de uma ou mais planilhas. Na
linha 4, instanciado um objeto do tipo SpreadsheetQuery.
Esta classe responsvel pela consulta aos documentos. Com
ela possvel criar filtros na busca, por exemplo, por nome, palavra chave, entre outros, conforme j foi descrito anteriormente.
Alm disso, possvel retornar os dados da consulta de acordo
com uma determinada ordenao, por exemplo, data de ltima
modificao, ltimo acesso, ttulo ou documentos marcados com
estrela. Note que na linha 5 verificado se o parmetro solicitado
no mtodo diferente de nulo ou vazio. Este parmetro define se
a consulta ir retornar todas as planilhas existentes ou uma em
especfico. Caso o nome da planilha foi especificado na passagem
do parmetro, ele adicionado no filtro da pesquisa, utilizando
a propriedade Title do objeto objQuery (linha 6).
Na linha 7 um objeto SpreadsheetFeed criado, por meio da
consulta realizada no servio, que representa o Feed do servio.

30 .NET Magazine Edio 93

A classe SpreadsheetFeed contm uma propriedade denominada Entry, que uma collection referente a lista de arquivos
retornados na consulta.
O mtodo ObtemSpreadsheetEntry, apresentado na Listagem 7,
tem como nica responsabilidade obter uma Entry presente em
um SpreadsheetFeed passado como parmetro. Neste exemplo,
apenas uma Entry ser recuperada, por isso, a primeira posio
da collection retornada (linha 4).
Listagem 6. Mtodo para obteno de um SpreadsheetFeed
1 private SpreadsheetFeed ObtemFeeds(string pNomePlanilha = )
2 {
3 SpreadsheetsService objService = this.SpreadsheetService;
4 SpreadsheetQuery objQuery = new SpreadsheetQuery();
5 if(!string.IsNullOrEmpty(pNomePlanilha))
6
objQuery.Title = pNomePlanilha;
7 SpreadsheetFeed objFeed = objService.Query(objQuery);
8 return objFeed;
9 }
Listagem 7. Mtodo para obteno de um SpreadsheetFeed.
1 private SpreadsheetEntry ObtemSpreadsheetEntry(SpreadsheetFeed feed)
2 {
3 SpreadsheetEntry objEntry = (SpreadsheetEntry)feed.Entries[0];
4 return objEntry;
5 }

As planilhas do Google Docs possuem uma estrutura semelhante as planilhas Excel: Em um arquivo do Excel (.xls), podem
existir diversas planilhas, no Google Docs no diferente. Ao
recuperarmos um Spreadsheet, ou seja, um arquivo do tipo
planilha, podemos consultar diversas outras contidas nele. Estas
planilhas so denominadas Worksheets.
Sendo assim, um SpreadsheetEntry pode conter vrios Worksheets. O mtodo ObtemWorksheetEntry, descrito na Listagem 8,
tem como responsabilidade obter um WorksheetEntry pertencente
ao SpreadsheetEntry passado como parmetro.
Listagem 8. Mtodo ObtemWorksheetEntry
1 private WorksheetEntry ObtemWorksheetEntry(SpreadsheetEntry workEntry)
2 {
3 SpreadsheetsService objService = this.SpreadsheetService;
4 AtomLink link = 5workEntry.Links.FindService(GDataSpreadsheetsName
Table.WorksheetRel, null);
5 WorksheetQuery objWorkQuery = new WorksheetQuery(link.HRef.ToString());
6 WorksheetFeed objWorkFeed = objService.Query(objWorkQuery);
7 return (WorksheetEntry)objWorkFeed.Entries[0];
8 }

Na linha 4 um objeto do tipo AtomLink criado, baseado no elemento <link> existente no WorksheetEntry. Este link contm a url de
acesso a planilha. O objeto objWorkQuery, do tipo WorksheetQuery,
utilizado para realizar a busca da planilha. Em nosso exemplo, todas
as planilhas contm apenas um Worksheet, sendo assim, a primeira
posio da lista de objetos entry retornada (linha 7).

A Listagem 9 define o mtodo AcessarPlanilhas(), que retorna


uma Collection do tipo ArrayList contendo todas as planilhas
encontradas na conta do Google Docs.
Na linha 3, um SpreedsheetFeed obtido por meio do mtodo
ObtemFeeds, j descrito anteriormente. Observe que nenhum
parmetro passado, j que desejamos neste momento recuperar
todas as planilhas. Um objeto ArrayList instanciado na linhas 4,
responsvel por armazenar o nome das planilhas encontradas, que
so obtidas atravs de uma estrutura de repetio foreach, para
percorrer cada objeto SpreedsheetEntry, ou seja, cada arquivo de
planilha encontrada na busca (linhas 5 a 8).
Perceba que at ento poderamos ter usado a API DocumentList
ao invs da Spreadsheet, pois os mtodos descritos fazem apenas a listagem das planilhas encontradas. Porm, para acessar o
contedo das mesmas, fazendo a leitura de cada clula, o uso da
API Spreadsheet Data essencial.
O mtodo LerPlanilha() tem este objetivo (Listagem 10). Nele
so lidos os dados contidos em uma determinada planilha, cujo
nome passado via parmetro.

agora recuperar as informaes de uma planilha especfica,


mais precisamente, da que possui nome igual ao parmetro. Um
objeto SpreadsheetEntry obtido, baseado no objFeed criado
e, em seguida, um WorksheetEntry instanciado, baseado no
objSpreadsheetEntry tambm criado anteriormente (linhas 5 e
6). O prximo passo executar uma consulta nas clulas desta
planilha, e para cada clula encontrada, recuperar o valor da
mesma e armazen-la na StringBuilder que foi definida no incio
do mtodo. Esta construo compreende as linhas 7 a 17.

Nota do DevMan
A linguagem C# 4.0 fornece o recurso de parmetros opcionais. Este novo recurso possibilita omitir
argumentos na invocao de um determinado mtodo. Na definio do mtodo, construtor, indexador
ou at em delegates possvel definir se um parmetro ser opcional ou no. Cada parmetro opcional
possui um valor padro como parte de sua definio. Se nenhum valor passado no momento da
chamada ao mtodo, o valor default utilizado.
Os parmetros opcionais devem ser declarados no fim da lista de argumentos, logo aps os
parmetros no opcionais serem declarados. O exemplo a seguir demonstra um mtodo que possui
um parmetro requerido, e dois parmetros opcionais:

Listagem 9. Mtodo AcessarPlanilhas

public void ParametrosOpcionais(string paramObrg, string paramOp1=a, int paramOp2=0)

01 public ArrayList AcessarPlanilhas()


02 {
03
SpreadsheetFeed objFeed = ObtemFeeds();
04
ArrayList listPlanilhas = new ArrayList();
05
foreach (SpreadsheetEntry objEntry in objFeed.Entries)
06
{
07
listPlanilhas.Add(objEntry.Title.Text);
08 }
09
return listPlanilhas;
10 }

Sendo assim, a chamada do mtodo ParametrosOpcionais poderia ser feita definindo apenas o
parmetro paramObrg: ParametrosOpicionais(value). Os demais assumem, respectivamente, os
valores a e 0, definidos na construo do mtodo.

Listagem 10. Mtodo LerPlanilha


01 public string LerPlanilha(string pNomePlanilha)
02 {
03 StringBuilder stbValores = new StringBuilder();
04 SpreadsheetFeed objFeed = ObtemFeeds(pNomePlanilha);
05 SpreadsheetEntry objSpreadsheetEntry = ObtemSpreadsheetEntry(objFeed);
06 WorksheetEntry objWorksheetEntry = ObtemWorksheetEntry
(objSpreadsheetEntry);
07 AtomLink cellFeedLink =
08 objWorksheetEntry.Links.FindService
(GDataSpreadsheetsNameTable.CellRel, null);
09 CellQuery objQueryCell = new CellQuery(cellFeedLink.HRef.ToString());
10 SpreadsheetsService objService = this.SpreadsheetService;
11 CellFeed objFeedCell = objService.Query(objQueryCell);
12 foreach (CellEntry currentCell in objFeedCell.Entries)
13 {
14
stbValores.Append(String.Format(Linha {0}, Coluna {1}: {2} <br />,
currentCell.Cell.Row,
15
currentCell.Cell.Column, currentCell.Cell.Value));
16 }
17 return stbValores.ToString();
18 }

O StringBuilder definido na linha 3 ir compor a string contendo


os dados da planilha. Na linha 4, um SpredsheetFeed criado,
recebendo o objeto do mtodo ObtemFeeds(). Perceba que desta
vez passado um parmetro para o mtodo, pois o objetivo

Autenticao
Para acessar os servios disponibilizados pelo Google, necessrio efetuar a autenticao no google por meio de uma conta pr
existente. Pelo fato de estarmos acessando um contedo privado,
a segurana dos dados trafegados na rede algo primordial.
A API GData oferece duas possibilidades para a realizao da
autenticao:
ClientLogin: Neste modo, as credenciais do usurio (login e
senha) so inseridas na prpria aplicao, que as envia para o Google. Uma vez autorizado possvel acessar os servios disponveis,
permitindo ao usurio manipular seus dados via sistema.
AuthSub: Neste modo os dados da credencial do usurio so
passados em uma pgina do google, no sendo necessrio informar os mesmos na aplicao.
Em uma aplicao desktop, a autenticao via ClientLogin a
mais indicada j que a aplicao estar sendo executada na prpria
mquina do usurio. Porm, para aplicaes WEB este modo de
autenticao no aconselhvel, pelo fato das informaes do
usurio estarem inseridas na aplicao, e estas hospedadas em
servidores no to seguros. Alm disso, caso voc esteja desenvolvendo um sistema para um cliente, ele pode no querer informar
os dados de sua conta pessoal.
Por isso, a autenticao via API AuthSub mais indicada neste
tipo de ambiente, onde o prprio usurio ir informar os dados
da conta no momento em que necessitar acessar um dos servios
do Google.

Edio 93 .NET Magazine

31

Integrao com Google Docs

O cdigo para autenticao utilizando a API AutSub mostrado na Listagem 11. Veja que o mtodo UrlAutenticao define
trs variveis, que so passadas ao mtodo esttico getRequestUrl (linha 10), da classe AuthSubUtil. Este mtodo retorna uma
string contendo a url da pgina do Google onde o usurio far
a autenticao. Os parmetros deste mtodo so os seguintes:
continueURL: Informa a URL da aplicao que ser chamada
quando o processo de autenticao terminar. No caso, a pgina
Docs.aspx ser chamada aps a autenticao, e vir com um
parmetro de nome token na url, necessrio para o acesso aos
servios. Esta URL definida na linha 8.
scope: Informa qual API ser utilizada pela aplicao. No nosso
caso, como vamos acessar planilhas presentes no Google Docs, a
API deste servio a Google Spreadsheet, definida na linha 9.
secure: Informa se a comunicao com o servio ser realizada
de forma segura, por meio de dados criptografados. Caso seja
escolhido passado o valor true, a aplicao deve possuir um
certificado digital vlido, utilizado para assinar as requisies
feitas aos servios. Como estamos desenvolvendo uma aplicao
de teste, este parmetro ser passado como o valor false.
s ession: Informe se o token de sesso(valor informado pelo
Google via URL), ser usado em apenas uma ou vrias requisies. Caso seja informado o parmetro false, este token no
vlido para novas requisies.
Todo este processo de autenticao ilustrado na Figura 1.
Listagem 11. Autenticao
01 using Google.GData.Client;
02 namespace GoogleDocs
03 {
04 public class Servico
05 {
06
public string UrlAutenticacao()
07
{
08
string continueUrl = http://localhost:56529/Docs.aspx;
09
string scope = http://spreadsheets.google.com/feeds/;
10
string authSubUrl = AuthSubUtil.getRequestUrl(continueUrl, scope,
false, true);
11
return authSubUrl;
12
}

j presente. Finalizando esta etapa, as requisies aos servios j


podem ser realizadas.

Interface
A interface da aplicao consiste basicamente em dois painis.
O primeiro ir listar todos os documentos do tipo planilha encontrados na conta dos usurios. A Listagem 12 apresenta o cdigo
referente a este painel. Observe que foi utilizada um controle do
tipo Repeater (linha 3), responsvel por gerar a lista de planilhas
encontradas. Nele, controles do tipo LinkButton so criados dinamicamente, onde o texto dos mesmos refere-se ao nome de cada
planilha encontrada. Ao clicar em um destes links, o contedo
da planilha referente mostrado no segundo painel. Este evento
ser exemplificado mais a frente.
Listagem 12. Painel referente a listagem dos documentos
...
1 <asp:Panel ID=pnlPlanilhas runat=server Width=200px>
2
<table>
3
<asp:Repeater ID=rptPlanilhas runat=server>
<HeaderTemplate>
<tr>
<td style=background-image: url(/Imagens/bar.png)>
<asp:Label ID=lblHeader runat=server Text=Planilhas
Font-Bold=True ForeColor=White></asp:Label>
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td width=100px>
<asp:LinkButton ID=lbtPlanilha Text=<%#Container.DataItem%>
onclick=lbtPlanilha_Click Font-Bold=True runat=server>
</asp:LinkButton>
</td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr>
<td>
<asp:LinkButton ID=lbtPlanilha Text=<%#Container.DataItem%>
onclick=lbtPlanilha_Click runat=server Font-Bold=True>
</asp:LinkButton>
</td>
</tr>
</AlternatingItemTemplate>
</asp:Repeater>
</table>
</asp:Panel>
...

Figura 1. Processo de autenticao


Veja que o processo se inicia com a requisio de um token.
Para isso, o usurio deve informar os dados da conta em uma
pgina WEB disponibilizada pelo Google. Aps a autenticao, o
usurio redirecionado a uma pgina pr-definida, com o token

32 .NET Magazine Edio 93

Conforme j mencionado, o segundo painel ir apenas mostrar


os dados contidos na planilha selecionada. O cdigo referente a
construo deste painel mostrado na Listagem 13. Ele contm
apenas um controle do tipo Literal (linha 6), que ir apresentar
os dados encontrados.

Acesso aos servios


A Listagem 14 apresenta o cdigo referente ao evento Page_Load da pgina
Docs.aspx. Na linha 5 verificado se a
autenticao j foi realizada, analisando se a url possui o parmetro token
definido, enviado pelo Google aps a
autenticao. Caso no exista, o mtodo UrlAutenticao() invocado, que,
conforme descrito anteriormente, ir
retornar uma string contendo a url para
o usurio se autenticar.
A url recebida passada como parmetro do mtodo Response.Redirect(), que
ir redirecionar a aplicao para a pgina de autenticao do Google (linha 8).
A Figura 2 refere-se a esta pgina, onde
devero ser informados o e-mail e a senha
relacionados a uma conta do Google.
Aps serem informados os dados da
conta, uma pgina de autorizao apresentada (Figura 3), mostrando os servios
que esto sendo solicitados, a pgina que
ser chamada aps a autorizao, algumas
mensagens de advertncia e os botes onde
o acesso pode ser autorizado ou no.
Feito todo o processo de autenticao
e autorizao, a pgina Docs.aspx
novamente acionada, mas desta vez
com o parmetro token embutido em
sua URL:
ht t p://loca l host:56529/Docs.aspx?
token=1%2FV-rQjbAxLMks5enePKOnZ5MPz9aaVeoT2n-4vZQLCHy5QwBA
Agora, com o token j existente, o evento
Page_Load da pgina executa a instruo
else. Na linha 12, o token recebido guardado em uma varivel de sesso. Observe
que antes ele passado como parmetro do
mtodo AuthSubUtil.exchangeForSessionToken(). Isso porque o token recebido via
url de uso simples, e em nossa aplicao
precisamos de um que dure mais tempo e
que no expire. Este mtodo ir atualizar
o token, dando a ele estas caractersticas.
Pelo fato dele no expirar, ele poderia
tambm ser armazenado em um banco
de dados, e associado a um determinado
usurio do sistema.
Na linha 14, o mtodo RecuperaListaPlanilha() invocado, e ser descrito no
prximo tpico.

Figura 2. Pgina de autenticao

Figura 3. Pgina de autorizao


Listagem 13. Painel referente ao contedo da planilha
...
1 <asp:Panel ID=pnlConteudo runat=server Height=220px Width=500px>
2
<div style=background-image: url(Imagens/bar.png) align=center><asp:Label ID=lblTitulo runat=server
3
Text=Contedo da planilha Font-Bold=True ForeColor=White></asp:Label>
4
</div>
5
<div>
6
<asp:Literal ID=ltlDadosPlanilha runat=server></asp:Literal>
7
</div>
8
</asp:Panel>
...
Listagem 14. Evento Load da pgina Docs.aspx
01 protected void Page_Load(object sender, EventArgs e)
02
{
03
if (!IsPostBack)
04
{
05
if (Request.QueryString[token] == null)
06
{
07
Servico servico = Servico.Instance();
08
Response.Redirect(servico.UrlAutenticacao());
09
}
10
else
11
{
12
Session[Token] =
13
AuthSubUtil.exchangeForSessionToken(Request.QueryString[token], null).ToString();
14
RecuperarListaPlanilhas();
15
}
16
}
17
}

Recuperando os dados
A Listagem 15 demonstra o mtodo
RecuperaListaPlanilha(). Sua responsabilidade preencher o controle Repeater,
definido na interface, com a lista de planilhas encontrada na conta do Google Docs.
Para isso, o mtodo AcessarPlanilhas(), da

classe Servicos, acionado (linha 4). Deste


modo, para cada planilha encontrada, um
controle do tipo LinkButton criado na
interface. Acionando um destes Links, o
contedo da planilha relacionada apresentado no panel pnlConteudo, definido
na interface.

Edio 93 .NET Magazine

33

Integrao com Google Docs

Listagem 15. Mtodo RecuperaListaPl


1 private void RecuperarListaPlanilhas()
2
{
3
Servico objServico = Servico.Instance();
4
ArrayList listaPlanilhas = objServico.AcessarPlanilhas();
5
rptPlanilhas.DataSource = listaPlanilhas;
6
rptPlanilhas.DataBind();
7
}

duo (Google Translator toolkit API) para traduzir documentos


existentes no Google Docs.

O cdigo referente ao evento click dos controles LinkButton


mostrado a seguir. Na linha 3, obtido o nome da planilha, por
meio da propriedade Text do link clicado. O mtodo LerPlanilha(), da classes Servios, invocado, retornando uma string com
o contedo da planilha (linha 5). Esta string ento passada ao
controle Literal da interface.
1
2
3
4
5
6

protected void lbtPlanilha_Click(object sender, EventArgs e)


{
string nomePlanilha= ( (LinkButton)sender ).Text;
Servico objServico = Servico.Instance();
ltlDadosPlanilha.Text = objServico.LerPlanilha(nomePlanilha);
}

Execuo
A Figura 4 apresenta a pgina Docs.apx, depois de efetuado o
processo de autenticao. Veja que so listadas todas as planilhas
encontradas na conta do Google Docs, em um formato de link.

Figura 5. Contedo da planilha GData API


Enfim, um leque de possibilidades est disponvel para o desenvolvedor. Basta ter criatividade e saber usar a biblioteca cliente
do Google para acessar seus servios e integr-los em aplicaes
.NET, sejam elas voltadas para o ambiente WEB ou Desktop.
Ericksen Viana Sampaio
ericksen.sampaio@gmail.com
Ericksen Viana Sampaio analista desenvolvedor de sistemas. Atua na
rea de desenvolvimento WEB utilizando ASP.NET C#. Possui o ttulo de
MCTS (ASP.NET 4.0). graduado em Cincia da Computao pela faculdade
Pedro Leopoldo e ps-graduado em Anlise de Sistemas pela UFMG.

GData Protocol
http://code.google.com/apis/gdata/docs/2.0/reference.html
Biblioteca .NET Cliente
http://code.google.com/p/google-gdata/downloads/list

Concluso

34 .NET Magazine Edio 93

Autenticao
http://code.google.com/apis/accounts/docs/AuthSub.html
REST
http://www.ibm.com/developerworks/webservices/library/ws-restful/
D seu feedback sobre esta edio!
A Java Magazine tem que ser feita ao
seu gosto. Para isso, precisamos saber
o que voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/javamagazine/feedback

Feedback
eu
sobre e
s

Este artigo mostrou uma pequena parte da API de dados do


Google, que composta por uma srie de APIs para acesso e manipulao dos diversos servios fornecidos pelo Google, como o
Analytics, Maps, Picasa, entre outros.
A aplicao criada serve como exemplo para o desenvolvimento
de novos projetos e solues que faam uso destes recursos. A
integrao de mais de um servio em uma mesma aplicao pode
ser bem interessante, por exemplo, a utilizao do servio de tra-

Spreadsheet
http://code.google.com/apis/spreadsheets/data/3.0/developers_guide.html

D
s

Clicando em uma delas mostrado o contedo da mesma


no painel ao lado. Vamos acionar a planilha GData API, que
possui 7 linhas e 3 colunas, contendo o nome do conjunto de
APIs referentes aos servios do Google, como pode ser visto
na Figura 5.

edio
ta

Figura 4. Lista de planilhas recuperadas

Google docs
http://semmisterios.wordpress.com/2011/01/08/integracao-com-o-googledocs/#comments

Edio 93 .NET Magazine

35

Seo .NET: Nesta seo voc encontra artigos intermedirios sobre as tecnologias .net

Windows Phone 7.5

Conhea as novidades da verso Mango


Resumo DevMan
De que se trata o artigo:
O artigo trata das melhorias e novidades do Windows Phone 7.5, mais conhecidoporseu codinome Mango.
A mesma a ltima verso do sistema operacional e j est disponvel no Brasil.

Em que situao o tema til:


Para o desenvolvimento de aplicaes que utilizem recursos de cmera, banco de dados locais, udio
e notificaes na tela do celular,alm de mostrar tcnicas para analisar pontos crticos da aplicao, tais
como o uso de memria e performance da aplicao.

Windows Phone 7.5 :


O Windows Phone 7 ainda uma plataforma muito nova no mercado. Mesmo assim j possvel dizer que
a tecnologia veio para concorrer de frente com outros sistemas operacionais mobile (Android e IOS).No incio
do artigo visto as novidades de templates do Visual Studio. Estes templates servem para voc desenvolver
tipos especficos de aplicaes, desde um simples Hello World at o uso de udio com streaming.

ma das principais novidades do


Windows Phone o Marketplace
disponvel no Brasil. Desta forma,
voc tem a possibilidade de publicar suas
aplicaes a nvel nacional, alm de continuar publicando mundialmente.
Para quem j desenvolvedor e j possui
aplicativos publicados, ao republic-lo, ver
o Brasil listado como um dos mercados.
O App Hub mostra todas essas questes
de forma simples e direta, voc no ter
problemas para realizar esse processo.
O App Hub o site oficial que centraliza
a publicao de aplicaes para o Windows
Phone. Na seo Links voc confere o endereo completo para acesso.

Templates Visual Studio


Uma das grandes novidades da nova
verso do Windows Phone os novos
templates includos no Visual Studio.
Atravs do menu File -> New Project,
na guia Silverlight for Windows Phone
(Figura 1) voc encontra todos eles. Na
Tabela 1, voc encontra a descrio completa de cada templates.

36 .NET Magazine Edio 93

Nota
A palavra Mango foi apenas um codinome utilizado
internamente pela Microsoft e uma das formas que voc ir
encontrar contedo na internet a respeito desta verso. Porm
o novo Windows Phone atende comercialmente por Windows
Phone 7.5. J para ns desenvolvedores, sempre devemos
procurar pela verso Windows Phone O.S. 7.1 quando
desejarmos encontrar o SDK (ou sua documentao).
Nota
Este artigo no ir abordar a instalao e configurao das
ferramentas necessrias, para isto, veja a seo Links.

Outras novidades
O profiler permite que o desenvolvedor
analise como sua aplicao est se comportando em relao memria, performance
etc. Isto importante para quem deseja ter
sua aplicao aceita no Marketplace.
Outra ferramenta importante para a publicao de suas aplicaes o Marketplace
Test Kit. Com essa soluo, um simples
clique com o boto direito em cima de seu
projeto (Figura 2) possibilitar a abertura de
uma interface onde o desenvolvedor insere

Rodolpho Marques do Carmo


o seu projeto em um arquivo .xap. (Toda aplicao Silverlight gera
um pacote desse tipo, e uma aplicao Windows Phone 7 instalada
em um telefone nada mais do que um pacote .xap). Alm disso,
voc deve inserir atravs deste utilitrio os cones e previews de
sua aplicao.
Os testes que o Test Kit realiza em sua aplicao similar aos que
sero realizados pela equipe do Marketplace, assim, voc acaba

Nota do DevMan
Windows Communication Foundation (WCF) um modelo de programao unificado e ambiente
de execuo (Framework) criado pela Microsoft que visam construo de aplicaes orientadas a
servios (Service Oriented Architecture).

Figura 1. Templates disponveis

Template

Descrio

Windows Phone Application

Template que cria uma aplicao em branco. O mais simples dentre os disponveis. Neste voc ter apenas
uma tela com basicamente nenhum cdigo pronto.

Windows Phone Databound Application

Este template j vem preparado para a conexo com algum banco de dados. O mesmo adiciona um ListBox
que voc pode preencher com informaes.

Windows Phone Class Library

uma biblioteca de classes que gera uma DLL que pode ser redistribuda pelo desenvolvedor. Use esse
template quando precisar reutilizar suas classes em outros projetos Windows Phone.

Windows Phone Panorama Application

Template que cria um projeto utilizando o controle Panorama. Ideal para criar o look and feel parecido com
os Hubs nativos do Windows Phone.

Windows Phone Pivot Application

Assim como o panorama, porm utilizando a soluo do controle Pivot, tambm possibilitando um visual que
atende interface Metro.

Windows Phone Silverlight and XNA Application

O template entrega um projeto pronto para a renderizao do XNA em uma aplicao Silverlight. Isso resolve
diversos problemas e pontos onde o Silverlight ainda no possui suporte, por exemplo, criar uma aplicao
3D de vendas de carros, onde voc consegue visualizar sua compra em 360.

Windows Phone Audio Playback Agent

Funciona como uma biblioteca de classes, mas destinado especificamente a executar udio em background
(possvel a partir do Mango usando o o conceito denominado de Agentes). Ou seja, utilizando este tipo de
projeto (o udio Playback agente apenas gera uma DLL) sua aplicao pode continuar executando udio
mesmo que ela no esteja sendo executada no momento.

Windows Phone Audio Streaming Agent

Funciona como o Phone Audio Playback, mas com o intuito de suportar streaming de udio.

Windows Phone Scheduled Task Agent

Similar aos templates Agents anteriores, porm executa tarefas recursivas no background. Veremos mais
sobre o conceito de agentes em um tpico dedicado, mas, imagine o cenrio de uma aplicao que precisa
sincronizar dados todas as noites, mesmo se o usurio no estiver utilizando a mesma. O problema pode ser
resolvido criando um projeto do tipo Scheduled Agent.

Tabela 1. Templates do Visual Studio para Windows Phone 7

Edio 93 .NET Magazine

37

Windows Phone 7.5

reduzindo (e muito) as dores de cabea que


poder encontrar ao publicar sua aplicao, j que o mesmo ir prever possveis
erros, tais como o tempo de abertura de
sua aplicao e se os screenshots foram
adicionados (importante para exibir uma
preview de sua APP no Marketplace).
Na Figura 3 voc confere o resultado do
profiler, aps anlise de uma aplicao.
Note que possvel selecionar trechos
para visualizar a rvore de execuo, problemas especficos de memria, threads,
Garbage Collector etc. Para executar este
tipo de verificao em sua aplicao basta
acessar o menu Debug(do Visual Studio)
e escolher a opo Start Windows Phone
Performance Analysis, conforme mostra
a Figura 4.

Emulador

Figura 2. Marketplace Test Kit

Figura 4. Executando Profiler

Figura 3. Profiler em ao

38 .NET Magazine Edio 93

O emulador do Windows Phone bastante completo. Uma das novidades trazidas


por ele o Additional Tools, conjunto
de ferramentas que ajudar a testar sua
aplicao.
sempre complicado testar aplicaes
que faam uso do acelermetro de forma
parecida com o utilizado em um dispositivo real. No emulador voc possui a
imagem do telefone e pode emular esse
processo usando a nova tool, conforme
pode ser visto na Figura 5.
Assim como a forma anterior, para testar
a localizao, possvel definir um ponto
no mapa para sua localizao atual e utilizando triggers(gatilhos) disparar atualizaes de localizao para o emulador.
Outra feature a possibilidade de tirar

uma foto da tela do emulador, porm isso


no funciona no telefone de forma nativa.

Modelo de execuo / Multitask / Fast


Switching
Assim que o usurio sair de uma aplicao e mantiver a instncia dessa aplicao
viva (por exemplo, pressionando o boto
Windows), a mesma precisava salvar o
estado para conseguir ser exibida posteriormente. Ou seja, a aplicao no estava
realmente na memria e precisava ser
recriada no plano de fundo para dar a
impresso ao usurio que ela continuou
igual.
Com a nova verso temos um novo estado chamado Dormant, onde o Windows
Phone mantm a aplicao intacta na
memria, tornando a troca de aplicaes
mais rpida (conceito chamado de Fast
Application Switching). Por exemplo, se o
usurio estiver usando a aplicao e pressionar o mesmo boto Windows, voltar
tela inicial, mas a aplicao se manter
viva e intacta na memria.
importante salientar que depois que
sua aplicao entrar no estado Dormant,
e caso voc no requisite novamente esta
aplicao, ela cair no estado denominado
de Tombstoned e precisar salvar seu
estado.
Isso acontece, pois o Windows Phone
inteligente o bastante para sempre favorecer o usurio. Ele mantm uma aplicao
intacta na memria at o momento que
achar necessrio e comea a matar as
aplicaes para salvar outras ou, at mesmo economizar bateria. Para o conceito
ficar mais claro, veja a Figura 6.
Ao abrir uma aplicao e entrar em uma
tela, o mtodo OnNavigatedTo disparado
e a aplicao entra em Running. Se o usurio pressionar o boto back (lembre-se,
todos os Windows Phone tem trs botes
obrigatoriamente Voltar, Windows e Busca, veja na Figura 7), disparado o evento
de closing e aquela instncia finalizada.
Qualquer dado que precisar ser persistido
(configuraes da aplicao, por exemplo), o processo deve ser disparado aqui.
Cuidado, pois o Marketplace exige que
todos os processos de finalizao sejam
completados em poucos segundos.

Ao usar a aplicao, caso o usurio pressione o boto Windows ou


mude de aplicao segurando o mesmo boto (ao de multitask),
assim como em caso de uma ligao aparecer, disparado o evento
Deactivated e a aplicao colocada no estado Dormant. Ela mantida intacta na memria. Porm, como explicado anteriormente, h
a possibilidade da aplicao ir para o estado Tombstoned.

Background Agents / File Transfers


Na questo multitarefa possvel executar tarefas no background. No Windows Phone podemos executar alguma tarefa da
aplicao mesmo quando ela no esteja rodando. No pense nisso
como um novo comeo de gerenciador de tarefas. A soluo aqui
muito mais elegante.
Figura 7. Botes Windows Phone

Figura 5. Acelermetro, localizao e screenshot no emulador

Voc tem possibilidade de rodar tarefas no background, os


chamados Scheduled Tasks. Nesse caso, sua aplicao pode
ter um (e apenas um) agente que voc ir definir, conforme sua
necessidade.
Existe o Periodic Task (executar de forma mais frequente pois no
exige que o telefone esteja sendo carregado, por exemplo, porm
o O.S. libera poucos recursos e por um curto perodo de tempo)
ou Resource Intensive Task (executa por um perodo maior de
tempo, com mais recursos, mas exige que o telefone esteja sendo
carregado e em uma conexo WI-FI ou conectado ao PC).
Mais do que executar cdigo no background possvel usar a
API do sistema operacional para criar os lembretes ou alarmes
que aparecero no topo da tela do usurio. Dessa forma, sua
aplicao pode disparar um lembrete ao usurio que pode aceitar ou postergar, alm de entrar na aplicao e executar alguma
ao. Outra possibilidade poder fazer download de arquivos,
mesmo quando a sua aplicao no est sendo executada. Isso
acontece atravs dos Background File Transfers (e restries
tambm se aplicam).
Voc tambm tem a possibilidade de executar udio e mant-lo
rodando mesmo que sua aplicao no esteja mais ativa. O udio
criado atravs do template que vimos anteriormente e referenciado
no projeto de aplicao Windows Phone.
Veja parte do cdigo criado a partir do template AudioPlayback
Agent na Listagem 1. Note que a soluo toda resolvida com o
uso da classe AudioPlayer que herda de um AudioPlayerAgent
(um BackgroundAgent).
Esse projeto deve ser referenciado em uma Windows Phone
Application. Na Listagem 2 voc encontra o cdigo que deve ser
utilizado para iniciar o som.

Sensores e Launchers/Choosers

Figura 6. Modelo de execuo Windows Phone 7.5

Em relao cmera, anteriormente s tnhamos acesso mesma


atravs de um Chooser (Launchers e Choosers so APIs que nos
permitem acesso a recursos mais baixo nvel do telefone, por assim dizer, retornando ou no valores) que disparava a cmera e, ao
ter a foto como resultado, nos dava a possibilidade de usar a mesma
em nossa aplicao. Ou seja, um processo totalmente assncrono.

Edio 93 .NET Magazine

39

Windows Phone 7.5

Listagem 1. AudioPlayback Agent


using System;
using Microsoft.Phone.BackgroundAudio;
using System.Collections.Generic;
namespace AudioPlaybackAgent
{
public class AudioPlayer : AudioPlayerAgent
{
static int current = 0;
protected override void OnUserAction(BackgroundAudioPlayer player,
AudioTrack track, UserAction action, object param)
{
// Verifica a opo a ser escolhida, por exemplo, Play.
switch (action)
{
case UserAction.Play:
PlayMusic(player);
break;
case UserAction.Pause:
player.Pause();
break;
case UserAction.Stop:
player.Stop();
break;
case UserAction.SkipNext:
PlayNextSong(player);
break;
case UserAction.SkipPrevious:
PlayPreviousSong(player);
break;

Na nova verso foi possibilitado acesso cmera em real time,


voc pode criar uma interface dentro da sua aplicao que use
a cmera, podendo inclusive utilizar o template de Silverlight +
XNA para criar uma aplicao ou jogo usando realidade aumentada. Na Figura 8 voc visualiza este exemplo.
De qualquer forma, mantendo sempre o quesito segurana,
para fazer uso desta ideia, mudanas no manifesto so necessrias. As mesmas iro mostrar ao usurio no Marketplace que
sua aplicao faz uso da cmera. No Windows Phone, o usurio
sempre o foco da ateno e no h como uma aplicao drenar
bateria do usurio sem o consentimento explcito. Assim, ao utilizar os Agents, onde teremos cdigo executando no background
sem que o usurio perceba, ser necessrio obrigatoriamente
termos um boto explcito na aplicao pedindo a liberao por
parte do mesmo para essa situao ocorrer.

}
NotifyComplete();
}
private void PlayMusic(BackgroundAudioPlayer player)
{
// Recupera a lista de msicas
List<Music> listMusic = GetMusic();
player.Track = new AudioTrack(listMusic[current].Location, listMusic
[current].SongName, listMusic[current].Artist, listMusic[current].Album, null);
player.Play();
}
}
}
Listagem 2. Projeto WP7 que referencia o AudioPlayback
void Instance_PlayStateChanged(object sender, EventArgs e)
{
// Recupera a instncia de AudioTrak
AudioTrack track = BackgroundAudioPlayer.Instance.Track;
if (track != null)
{
// Definido informaes da msica
this.currentMusic.Text = track.Artist + - + track.Title + do disco
+ track.Album;
}
}
private void btnPlay_Click(object sender, RoutedEventArgs e)
{
BackgroundAudioPlayer.Instance.Play();
}

40 .NET Magazine Edio 93

Figura 8. Utilizao da cmera em app no Windows Phone

Tiles e Push Notifications


Com este recurso o usurio pode receber notificao no telefone
sobre novidades de sua aplicao sem que seja necessrio criar
um servio que fique ouvindo e questionando um servidor na
nuvem por atualizaes. Exemplificando, pense em um cenrio de
aplicao de futebol que mostrar resultados de jogos. Voc quer
que seu usurio receba uma novidade quando um gol for marcado.
Porm, no faz sentido ficar questionando um servio a todo o
momento perguntando h gols?. A soluo o Microsoft Push
Notification Service (MPNS) que trabalha de forma a receber
uma mensagem de um servio, juntamente com os assinantes
(aparelhos que iro receber essa atualizao) e dispar-la aos
respectivos telefones. Ou seja, o caminho inverso e seu telefone
assina o recebimento dessas novidades e, a partir dai, as recebe no
sentido servio-MPNS-telefone. No final, voc tem baixo consumo
de bateria e uma soluo mais robusta.
Temos trs tipos de Push Notifications: as Toast Notifications
(mensagem no topo da tela aparece sem a aplicao estar sendo
executada veja a Figura 9), Tile Notifications (na tela inicial,
tambm atualizado sem que a aplicao esteja sendo executada
veja a Figura 10) e Raw Notifications (XML com menos restries do que os anteriores, mas s recebemos o pacote dentro da
aplicao se a mesma no estiver em primeiro plano, a mensagem
ignorada). No Toast podemos passar uma mensagem com ttulo,

texto, alm do conceito interessante de deep toast, onde podemos passar um parmetro e entrar na aplicao direto em uma
pgina especfica, por exemplo, na aplicao de futebol, podemos
informar os gols e entrar diretamente na pgina de resultados
de nossa aplicao.
J o Tile o que est sendo chamado de bloco dinmico no Brasil.
Ele aquele quadrado que cada aplicao tem na tela inicial. Na
Figura 9 temos o Tile do Internet Explorer. Podemos informar ao
usurio muita coisa sobre a aplicao sem que ele precise entrar
na mesma. uma espcie de notificaes, por exemplo, o jogo
acabou ou no h conexo com o servidor.

um principal apresentando a aplicao e mostrando atualizaes


gerais, como podemos ter um especfico para o time do usurio
que iria ser adicionado tela inicial e ir diretamente pgina
daquele time quando requisitado. O cdigo para criao de um
Tile simples e voc confere na Listagem 3.
Utilizamos a classe StandardTileData para criarmos o Tile com
parmetros para imagem de fundo, contador e ttulo (parte da
frente do tile). Na parte de trs, ttulo, contedo e imagem de
fundo. Aps isso, usamos o mtodo Create da classe ShellTile para
instanciar e o colocar na tela inicial. Sua aplicao comear a ter
uma coleo de tiles, acessveis atravs de ShellTile.ActiveTiles.

O Silverlight

Figura 9. Toast Notification

No Silverlight temos coisas bem interessantes e simples, porm


que ajudam muito no dia a dia de criao de uma aplicao,
como fallback value, onde definimos um valor default caso
no recebermos o valor que esperamos. O rich text box que nos
permite coisas que hoje no temos em um bloco de texto no controle nativo, como links etc. Uma dessas solues so os estilos
implcitos, onde possvel definir, por exemplo, que todos os
textblock tero determinada fonte com determinada cor, sem que
seja necessrio criar resources e referenciar em cada controle. A
Listagem 4 mostra como isso acontece em um cdigo XAML.
Qualquer textblock que no force uma das propriedades que estamos definindo implicitamente (note que no h key associado)
ir receber esse estilo.
Listagem 3. Criando Tile secundrio
StandardTileData NewTileData = new StandardTileData
{
BackgroundImage = new Uri(ImagemFundo.jpg, UriKind.Relative),
Title = tile secundrio,
Count = 3,
BackTitle = parte de trs,
BackContent = Textos informativos ao usurio,
BackBackgroundImage = new Uri(ImagemTraseira.jpg, UriKind.Relative)
};

Figura 10. Tile secundrio - parte frontal e traseira


Outro ponto interessante que podemos ter mltiplos Tiles para
cada aplicao. Um obrigatrio, mas, caso nossa aplicao possa
entregar mais contedo ao usurio, pode-se criar uma tela inicial
com mais de um. No caso da aplicao do Facebook, podemos
ter o Tile principal que nos d atualizaes da nossa wall (as
notificaes j so mostradas na tela inicial), assim como podemos ter Tile para quantidades de mensagens novas, por exemplo.
Voltando ao nosso exemplo do futebol, se pudssemos ter um
ttile, ele teria que mostrar todas as atualizaes da aplicao.
No seria interessante, pois gostaramos de mostrar os gols de
um time especfico, separados. Jogos ocorrem ao mesmo tempo,
mas o usurio pode querer seguir na tela inicial apenas os gols
de seu time. Ento possvel gerar mltiplos Tiles. Podemos ter

ShellTile.Create(new Uri(/PaginaDoTime.xaml?param=UmParametro,
UriKind.Relative), NewTileData);
Listagem 4. Estilos implcitos
<phone:PhoneApplicationPage>
<phone:PhoneApplicationPage.Resources>
<Style TargetType=TextBlock >
<Setter Property=FontSize Value={StaticResource PhoneFontSize
Large}></Setter>
<Setter Property=FontFamily Value={StaticResource PhoneFontFamily
Light}></Setter>
<Setter Property=HorizontalAlignment Value=Center></Setter>
</Style>
</phone:PhoneApplicationPage.Resources>
</phone:PhoneApplicationPage>

Edio 93 .NET Magazine

41

Windows Phone 7.5

Silverlight + XNA
Um ponto que d dor de cabea aos desenvolvedores a dificuldade de se criar aplicaes ricas visualmente com 3D, mas
sem abandonar o Silverlight. Isso possvel no Windows Phone
atravs do template Silverlight and XNA Application que, como
o nome diz, permite que XNA seja renderizado em uma aplicao Silverlight. Ou seja, a ideia que o desenvolvedor continue
escrevendo uma aplicao da mesma forma que conhecem, com
Application Frame, Pages, mas que em determinado momento
ir renderizar XNA. A aplicao Silverlight pode sair de cena e
dar espao ao XNA ou ento podemos renderizar XNA e Silverlight juntos, em camadas sobrepostas, na mesma tela, conforme
mostrado na Figura 11.

na verso Mango. No tnhamos banco de dados local nativo na


primeira verso do S.O. Para o conceito do banco de dados local
preciso que voc entenda trs pontos:
Primeiro, importante entender que o paradigma aqui diferente, seja pelo momento que vivemos em relao devices ou
mesmo a conexes WI-FI, nem sempre ser necessrio criar um
banco de dados completo, nem sempre ser a soluo mais correta
continuar trabalhando da forma como foi feita at a ltima gerao
de smartphones. Muitas vezes poderemos criar um Background
Agent (Resource Intensive Task), e fazer uso dessa soluo para
sincronizar dados.
Segundo, todas as operaes no banco so feitas utilizando
Linq to SQL. Voc no ir escrever cdigo T-SQL na sua aplicao
Windows Phone. Voc estar sempre utilizando um objeto que
representa o seu banco de dados (Data Context) e atravs de um
runtime a aplicao mapear o objeto para o relacional, permitindo
ao desenvolvedor escrever LINQ e ser lido pelo banco relacional.
A Figura 12 mostra como isso acontece.
Terceiro, o banco de dados, diferente do desktop, no roda em
um servio prprio. Aqui, seu banco est rodando no processo
da sua aplicao, ou seja, disponvel apenas a ela.

Figura 11. Silverlight + XNA renderizados na mesma pgina


O que possibilita a renderizao de XNA em uma aplicao Silverlight o SharedGraphicsDeviceManager. Ele ser colocado na
app.xaml e responsvel pela mgica. Posteriormente, quando
estiver em uma pgina na qual desejar ligar a renderizao
XNA, utilize o evento OnNavigatedTo e chame o mtodo SetSharingMode passando o parmetro true. Dessa forma, o SharedGraphicsDeviceManager retira o Silverlight de cena e passamos
a renderizar somente XNA.
Para que possamos renderizar os dois ao mesmo tempo, como
na Figura 11, todos os controles Silverlight precisam estar no
XAML, mas somente isso no os far aparecer na tela, pois como
mencionei, o SharedGraphicsDeviceManager ir retirar o Silverlight e liberar recursos para que o XNA atue. O que precisamos
fazer utilizar o recurso UIElementRenderer para criar um layer
e desenhar camada a camada (XNA+SL), na ordem que quisermos
(Silverlight pode estar por cima ou por baixo) e ento chamar o
draw na tela e mostrar ao usurio como uma nica soluo.

Banco de dados local


A possibilidade de guardar dados localmente no telefone extremamente necessria em alguns casos. Tnhamos o Isolated Storage, alm de solues de terceiros, mas ter acesso a uma soluo
nativa e relacional era a requisio de muitos e foi disponibilizada

42 .NET Magazine Edio 93

Figura 12. Local Database

Concluso
Entender todos os conceitos por completo de uma plataforma que
comea a se tornar grande, com mltiplas verses, pode ser algo
complicado. necessario entender primeiramente o que tem na
mo, quais so as opes. Entendendo isso, tenho certeza que voc
consegue tomar a deciso correta, seguir o caminho aprimorandose no conceito que desejar. Tentei focar aqui em coisas que podem
ser novidades para quem j comeou a desenvolver desde 2010
e ainda est desenvolvendo aplicaes simples, com Silverlight,
Launchers, Choosers, Servios etc.
Com o artigo, espero ter conseguido passar a grandiosidade do
sistema operacional, algumas features no to comuns e tambm

o futuro do Windows Phone. Estamos diante de um grande lanamento e as possibilidades para os desenvolvedores s crescem.
Cabem a ns continuarmos nosso estudo e nos prepararmos a
atender um mercado que ser imenso, pois o investimento da
Microsoft Brasil no ser nada menos do que gigantesco. Gartner e
IDC, dois dos maiores nomes mundiais j afirmaram, o Windows
Phone vai competir de igual para igual e alcanar o segundo lugar
em quatro anos. esperar para ver!
Rodolpho Marques do Carmo
rcarmo@conexaowindows.com | www.conexaowindows.com
Profissional certificado em Windows Phone Development. Formado
em Cincia da Computao pela Universidade Federal do Paran
(UFPR), trabalha com .NET e tecnologias Microsoft h 8 anos. Atualmente trabalha na empresa americana Taos Technologies, entusiasta por
plataforma Microsoft e especialmente Windows Phone 7, sendo responsvel pelo site e
podcasts do Conexo Windows (http://www.conexaowindows.com).

D seu voto sobre este artigo, atravs do link:


www.devmedia.com.br/javamagazine/feedback

D
s

Windows Phone Brasil


http://www.windowsphonebrasil.net

Centro de treinamento WP7 MSDN Brasil


http://msdn.microsoft.com/pt-br/hh230679
Silverlight e XNA
http://bit.ly/wp7silverlightexna

sobre e
s

A Java Magazine tem que ser feita ao


seu gosto. Para isso, precisamos saber
o que voc, leitor, acha da revista!

Biblioteca MSDN
http://msdn.microsoft.com/en-us/library/ff402535(v=vs.92).aspx

Webcasts de Windows Phone (muitas das features esto exemplificadas)


http://www.youtube.com/conexaowindows

Feedback
eu

edio
ta

D seu feedback sobre esta edio!

Download das ferramentas de desenvolvimento


http://create.msdn.com

App HUB
http://create.msdn.com
Publicando aplicaes no Marketplace
http://msdn.microsoft.com/en-us/library/ff941089(v=vs.92).aspx

Seo .NET: Nesta seo voc encontra artigos intermedirios sobre as tecnologias .net

HTML 5

Novidades da principal tecnologia para web

odo navegador web, quando exibe


uma pgina, apresenta HTML. Essa
linguagem utilizada para estruturar e organizar os componentes dentro de
um site. Quando uma pgina apresentada, ela s HTML, mesmo se foi construda usando ASP.NET. Isso mostra para
os desenvolvedores webque essencial
conhecer HTML j que tudo acontece em
volta desta linguagem. Claro que existem
outros recursos atrelados como JavaScript
e CSS, tecnologias que evoluram junto
com o seu parceiro HTML e so essenciais
para a construo de sites, mas, sem o
conhecimento da linguagem principal, de
nada vale os outros conceitos.
Essa evoluo determinante para a
utilizao das linguagens j que os desenvolvedores sempre procuram a tecnologia
que alcance o objetivo de uma forma mais
rpida e simplificada.
A nova verso do HTML, traz muitas
novidades e recursos em relao s verses
anteriores. Muitos conceitos foram simplificados, por exemplo, ao invs de criar
estruturas das pginas com divs ou tables,
existe uma tag para cada parte da pgina
como header representando o cabealho,
section representando o contedo da pgina e footer representando o rodap da
mesma. Essa apenas uma das novidades,
existem outras tags que ficaram mais fceis
de utilizar e apresentam novos recursos.
Ao utilizar o HTML5, facilita na hora
de desenvolver interfaces com o usurio,
junto com a ferramenta ASP.NET que
utiliza a gigantesca biblioteca .NET,
oferecendo recursos para a programao de negcio da aplicao, possvel
desenvolver grandes e robustos sistemas
na plataforma web.
O objetivo do artigo, apresentar as principais novidades e recursos do HTML 5,
e junto com a tecnologia ASP.NET, criar

44 .NET Magazine Edio 93

Resumo DevMan
De que se trata o artigo:
O artigo apresenta as novidades da verso 5 da linguagem HTML, mostrando novos recursos que podem
ser utilizados para facilitar a vida do desenvolvedor web. Tais novidades sero comparadas em relao s
verses anteriores do HTML.

Em que situao o tema til:


Para conhecer as novas tendncias para o desenvolvimento de aplicaes WEB. Com o HTML 5 muitas
questes sofreram alteraes e necessrio conhecer os novos recursos para a construo de aplicaes
WEB utilizando recursos prprios da linguagem, tornando tarefas primitivas mais simples. Alm disso,
para quem deseja entender melhor o que mudou nos novos itens de formulrio, por exemplo, um novo
recurso para validao de dados, para e-mail, nmeros, http, data etc.

HTML 5:
Novas verses de linguagens so criadas para facilitar cada vez mais a criao de sistemas/sites. Ento
necessrio estar ligado s tecnologias para sempre deixar o produto final melhor estruturado possvel,
isto , fcil de dar manuteno e atraente para o usurio que ir utiliz-lo. O HTML 5 veio para substituir
as antigas verses do HTML, trazendo consigo um cdigo simplificado e mais limpo, tornando-o uma
ferramenta essencial para a plataforma web nos dias atuais.

um pequeno formulrio, representando


um cadastro, mostrando que possvel
criar um sistema utilizando estas duas
tecnologias de ponta.

Histria do HTML
O HTML significa HyperText Markup
Language, foi criado na Sua, pelo ingls
Tim Berners-Lee.
Os documentos HTML so exibidos em
navegadores. Quando surgiu, era somente
texto, em um cenrio semelhante ao MSDOS. Com a evoluo, foi melhorando a
exibio e seus novos recursos. No se tem
somente texto e sim imagens, tabelas e at
aplicaes utilizando FLASH, por exemplo,
dentro de uma pgina HTML.
Hoje em dia, ainda existe uma discusso
sobre padronizao entre browsers, pois s
vezes uma caracterstica interpretada de
uma forma diferente entre os navegadores.
Existe uma organizao que se chama

W3C e ela que responsvel por manter


esse padro entre os navegadores, forando os desenvolvedores a seguir uma linha
que mantm todos em ordem.
Porm, ainda hoje, acontecem divergncias entre navegadores. E sempre quem
sofre com isso so os desenvolvedores
que tem que tentar adequar o site para
funcionar em um maior nmero possvel
de navegadores.

Documento HTML
Os navegadores de internet, como o Firefox, Internet Explorer e Chrome, quando
exibem uma pgina, mostram o documento
HTML da mesma. Um documento HTML
composto por um conjunto de tagsno formato XML. Estas tags e seus atributos, representam componentes e suas caractersticas
que so interpretados pelo navegador, e a
partir desse momento, ele desenha a pgina
conforme foi definido no documento.

Diego Eduardo Ferreira


A Figura 1 mostra o fluxo da requisio de um documento
HTML pelo navegador. O navegador requisita para o servidor web
a pgina, a partir do endereo do site, ou a URL. O servidor web
retorna o documento HTML para o navegador cliente requisitante,
ento, exibido o contedo.

Figura 1. Requisio de uma pgina pelo navegador do cliente


O cdigo a seguir, mostra um pequeno documento HTML com
as tags essenciais para abrir o documento no navegador.
<html>
<!-- Cabealho da pgina -->
<head>
<title>Ol!!! Sou um documento HTML</title>
</head>
<body>
<!-- Corpo da pgina -->
</body>
</html>

Somente esse cdigo que ser exibido quando a requisio do


cliente for atendida. Posteriormente, ser abordada cada uma
destas tags que o navegador interpreta, tanto na verso antiga
do HTML como na verso 5.

Tags da verso antiga


A principal tagque se manteve tanto nas verses antigas, como
na verso 5, foi a tag <html></html>. Ela tag que abre e fecha
o documento. O contedo que ser exibido deve ser estruturado
entre essa tag.
Nas verses antigas do HTML, existiam outras duas tags principais: head e body. A primeira define o cabealho. A segunda
onde fica estruturado o contedo da pgina.

dentro da tag head que se define o ttulo e recursos da pgina.


A tag que define o ttulo a title. O texto definido ser exibido
na barra de ttulo do navegador. Para resources, existem dois
caminhos: linkar arquivos que contenham os resources, ou
codific-los dentro da tag head. Existem doistipos de resource:
o script e o style.
O primeiro pode estar apontando pra um arquivo ou conter um
texto que faa alguma ao dentro da pgina, ou que sirva para
interatividade da tela, ou ainda, que sirva para disparar algum
cdigo que est no lado servidor.
J em relao ao segundo resource, divide-se em duas partes:
a definio dele direto na pgina ou em um arquivo separado.
Se for o primeiro, a tag correspondente ser style e l o desenvolvedor poder criar estilos para os componentes da pgina.
Agora, se os estilos forem definidos em um arquivo com a
extenso .css, dever ser usado a tag link, e apontar o local do
arquivo correspondente.
O body onde o programador cria a estrutura do site em si. Nele
estaro os componentes que organizam os controles, os controles
mesmo, como imagens, textbox e botes,e tambm no body
que sero realizadas as estilizaes e efetuadas as chamadas das
operaes dos scripts.

Tags pertencentes ao body


A maioria das tags do HTML pertencem ao body, ou seja, o
corpo da pgina. Pode-se separar as tags em dois grupos: as de
estruturao e as de interao com usurio. A primeira a forma
que ser organizada a posio dos componentes de interao com
o usurio. J o segundo, representa os caminhos que o usurio
poder se interagir com o site.
No HTML pode-se estruturar um site em formato tabela ou flutuante. No formato tabela, o programador deve definir as linhas
e colunas, e ir colocando os componentes dentro da coluna. J no
formato flutuante, se trabalha com div, que como se fosse um
particionador do documento. A partir dele pode-se dividir a tela
em vrias partes, como menu esquerdo, menu superior e exibio
do contedo, sem utilizar de tabelas, linhas e colunas.
Os controles de interao com o usurio so dispostos, dentro
da estrutura montada dentro do body, ou seja, dentrodos divs e/
ou tabelas. Pode ser uma caixa de texto, um boto, um checkbox,
radiobutton, combobox, entre outros tipos de controle. Existe uma
particularidade: os controles so definidos no atributo type da
tag input. So eles: button para boto, text para textbox, checkbox
para o checkbox e radio para radiobutton. Existe o campo hidden,

Edio 93 .NET Magazine

45

HTML 5

que como se fosse um textbox, s que ele fica escondido na tela.


Sua funo armazenar alguma informao que no dever ser
exibida na tela.
possvel colocar os controles somente dentro da tag body, sem
organiz-los atravs das tag de estrutura (div e table), porm, eles
ficam totalmente jogados na tela, sem organizao nenhuma.
A Listagem 1 mostra um documento HTML com a definio das
tags descritas anteriormente.
Listagem 1. Modelo cdigo HTML
<html>
<!-- Cabealho da pgina -->
<head>
<title>Ol!!! Sou um documento HTML</title>
</head>
<!-- Corpo da pgina -->
<body>
<!-- Definio do divisor da pgina -->
<div></div>
<!-- Definio de uma tabela -->
<table>
<!-- Linha -->
<tr>
<!-- Coluna -->
<td></td>
<tr>
</table>
<!-- Controles da pgina -->
<input type=text value=TEXTO />
<input type=button value=Clique! />
<input type=checkbox />Selecione
<input type=radio />Selecione
<input type=hidden />
</body>
</html>

Nota do DevMan
Geralmente, as pginas web fazem uma chamada ao servidor, de onde ela hospedada. Geralmente,
essa chamada indica que haver uma interao com o banco de dados. Somente o HTML no
possvel fazer essa conexo com o banco. Por isso, existem linguagens como PHP, ASP, ASP.NET entre
outras, que fazem esse trabalho nativamente, e o HTML dispara uma chamada de alguma funo
nessas linguagens, para se interagir com os dados externos.

Cascade Style Sheet


Toda pgina precisa de um ajuste na questo visual: centralizao de elementos, mudar a fonte padro, tamanho do ttulo, entre
outras caractersticas.Porm, os controles no oferecem todos os
atributos para realizar a mudana desejada. Por exemplo, possvel definir o tamanho de uma tabela na prpria tag, porm, no
possvel definir a fonte que ser utilizada dentro dela.
Para tal situao existe o CSS que nos permite definir os estilos
dos componentes HTML de uma forma completa. Oferece vrias
opes para mudana, tais como margem, espaamento, borda,
cor da fonte, cor da borda, tamanho da fonte, entre outros. Existem
trs formas de se aplicar os estilos: por ID da tag, nome da folha
de estilos ou o tipo de tag que dever ser aplicado.

46 .NET Magazine Edio 93

Quando se deseja aplicar uma folha de estilos a um componente


especifico, aconselhvel a dar um nome pra tal tag, no caso
utilizado o atributo ID, e referenciar o estilo para ser utilizado
somente em tags que tiverem o ID igual ao especificado.
Porm quando se precisa aplicar um estilo a mais que um elemento, mas as tags dos elementos so diferentes, ou iguais, mas
que no podem ter o mesmo ID, o recurso criar uma classe para
a folha de estilo. O estilo criado e lhe dado um nome. Para
definir em quais elementos ele dever ser aplicado, utiliza-se o
atributo class das tags HTML, passando o nome da classe que o
elemento dever pegar o seu estilo.
Alm disso, o CSS permite que um estilo seja aplicado a um
tipo especifico de componente. Por exemplo: os botes da pgina devem ter a borda cor azul do tamanho de 1 pixel e o fundo
branco. Ao invs de aplicar o estilo nos botes um por um, o CSS
permite criar um estilo que ser aplicado determinada tag. Ento,
somente ser necessrio criar o estilo e dizer que o mesmo ser
aplicado aos botes.
Para utilizar o CSS, existem trs formas: criar os estilos diretamente na tag style do elemento, criar os estilos na prpria
pgina, e criar um arquivo e referenciar o mesmo na tag head
das pginas.
O primeiro aconselhvel a pequenos e particulares ajustes, pois
seno, ao invs de facilitar, dificultar mais o trabalho, quando
os estilos devero ser aplicados em grupos. Definir os estilos na
pgina legal quando os mesmos serviro somente para a pgina
atual, e no sero utilizados em outras pginas, pois seno, os estilos tero de ser replicados em toda pgina que forem utilizados.
J o terceiro modo, e o mais utilizado, criar um arquivo com a
extenso CSS e definir os estilos l dentro, e aps a criao, apontar
ele na tag das pginas que ele ser utilizado.
O cdigo a seguir, de exemplo (um estilo CSS), aplicado ao corpo
da pgina, ou seja, a tag body:
body
{
font-size: 15;
font-family: Tahoma;
}

Atualmente, o CSS 3 e oferece muitos recursos visuais. Em unio


com o HTML 5, a pgina pode ser muito atraente na questo visual, basta conhecer bem os dois conceitos que grandes projetos
podem ser construdos facilmente.

JavaScript e JQuery
No existe pgina desenvolvida sem animaes. H vrias
formas de criar animao para uma pgina web. Uma muito
conhecida o Flash, porm, dependendo da animao, o site fica
sobrecarregado e demora um pouco mais para carregar.
Como alternativa existe o JavaScript, que uma linguagem capaz
de interagir com os elementos HTML, podendo no s anim-los,
mas tambm fazer operaes como mudar um texto que somente
leitura, esconder ou mostrar algum elemento, mandar alguma
mensagem na tela ou ainda abrir outra pgina. Os efeitos visuais

so bem mais pobres do que os feitos em Flash, porm, so bem


mais leves e rpidos.
O JavaScript baseado na linguagem Java, inclusive, possui a
mesma sintaxe na declarao das variveis e operadores. Uma diferena a declarao de um mtodo, que no caso uma function,
no possui atributo de visibilidade (private/public) e no possui
identificador de retorno (void/tipo). Para se declarar uma funo,
somente necessrio digitar function seguido com o nome e entre
parnteses os parmetros da funo.
Os elementos HTML possuem determinados eventos, alguns
em comum, outros especficos. As funes podem ser aplicadas
nesses eventos, como onblur, que quando o controle perde o foco,
ou no onfocus, quando o controle recebe o foco.
Recentemente foi criado um framework que ajuda ainda mais na
interao do usurio com a pgina: JQuery. uma tima biblioteca
JavaScript, que permite criar muitas coisas, ainda melhores que o
JavaScript. Com certeza, o JavaScript puro ser menos utilizado e
o JQuery ser utilizado com maior frequncia. Ambos no deixam
de ser JavaScript, porm, tem a diferena de um ser uma linguagem e o outro um framework da mesma linguagem.

HTML 5
Muitas novidades surgiram nesta verso do HTML, que o deixou
um pouco diferente das verses anteriores. As codificaes em termos
de HTML ficaram mais enxutas, por exemplo, nas verses antigas o
prprio desenvolvedor tinha que estruturar sua pgina em termos de
cabealho, rodap, corpoetc. No HTML 5, existem tags que j definem
isso ao ser declaradas, entre outras tags que facilitaram a vida dos
desenvolvedores, que sero posteriormente descritas.
Em relao estrutura, como j foi mencionado, algumas tags
foram criadas e possuem a funode dividirem a tela, de uma maneira geral, em cabealho, rodap, contedo, navegao e contedo
relacionado.Isso facilita e muito na hora de estruturar o layout da
pgina. A preocupao voltada somente para a formatao das
partes que foram criadas.
A tag header, que diferente da tag head, responsvel por
armazenar o contedo que est relacionado com o cabealho da
pgina. Geralmente, vai um logo nesta parte, ou ainda, o ttulo
da pgina que est aberta. Est localizada na parte superior da
pgina.
J a tag footer, que fica localizada na parte inferior da pgina,
responsvel por armazenar o contedo relacionado ao rodap.
Nesse contexto, usualmente est os dados da empresa, que fez o
site ou da empresa/pessoa que dona do site.
Para organizar o menu de navegao do site existe a tag nav. Esta
tag normalmente ficaalinhada na parte lateral da pgina, tanto na esquerda como na direita, dependendo do contexto. Nesta tag ficam os
links que devero acessar as outras pginas do site ou mostrar algum
contedo relacionado ao que est exibido. Esta a grande vantagem,
a diversificao de possibilidades de uma parte no HTML5.
Para contedo relacionado, como por exemplo, arquivos ou posts
e links relacionados com o que est sendo exibido, existe a tag aside.
Geralmente esta parte fica alinhada na parte lateral da pgina.

A principal tag desta nova organizao do HTML 5 a section.


Ela organiza as sesses do contedo da pgina. Dentro dessa
seo, pode-se ter um cabealho (a mesma tag header), rodap
(mesma tag footer) e a tag article. Esta ltima representa um item
de uma section. Ento, para se organizar o contedo principal do
site, ser dentro de uma section com as tags article.
A nica e obrigatria preocupao quanto ao estilo CSS para
organizar as tags do HTML 5. necessrio definir a orientao
das partes, margem, padding entre outros atributos, pois seno,
o resultado ficaria totalmente bagunado e totalmente fora do
esperado.
Segue a Listagem 2 com uma pequena pgina identificando cada
parte do HTML 5 com uma cor diferente para melhor aprendizado,
e em seguida, a Figura 2 ilustra como a pgina ficou no navegador.
Lembrando que na listagem j contm o cdigo CSS formatando
a posio dos divisores, para melhor identificao. Outro detalhe
a utilizao da tag <!DOCTYPE html>. Ela necessria para
informar ao navegador que ser utilizado o HTML 5.
A principal vantagem que os elementos esto bem identificados agora, e no como antes, que tinha um mar de divs ou
tables para organizar, alinhar e estruturar a pgina. Com as tags
nomeadas, ficou bem mais simples fazer manuteno em uma
pgina HTML.

Figura 2. Pgina de exemplo montada com o HTML 5 rodando no navegador

Outras tags do HTML 5


No foi s na questo estrutural que o HTML 5 sofreu mudanas.
Muitas tags foram simplificadas para melhorar o uso dos componentes. Uma delas foi figura. Esta tag simplifica o uso de imagens
e ainda d suporte a legendas. Segue cdigo com o seu uso..
<figureid=figura01>
<legend>Figura 1.</legend>
<imgsrc=caminho.pngborder=0width=200height=300/>
</figure>

Lembrando, que a legenda pode ser colocada antes ou depois da


imagem, o diferencial a tag que indica que a tag img e legend,
vo indicar o tratamento de uma figura.
Outra tag bastante interessante a udio. Ela executa um arquivo
de udio na pgina. O mesmo acontece com a tag vdeo, que ao
invs de udio, reproduz um arquivo de vdeo. Segue cdigo da
declarao dessas tags:

Edio 93 .NET Magazine

47

HTML 5

<audiosrc=musica.mp3autoplay=autoplayloop=1000/>
<videosrc=video.movwidth=300height=300/>

Existe tambm, a tag dialog que indica que iniciara um texto que
representa algum dilogo. As tags dt e dd indicam os participantes
da conversa. Segue exemplo:
<dialog>
<dt> Ol! Como est seu notebook?
<dd> Oi! Est tudo OK! No apareceu mais o problema.
<dt> Certo!
<dd> Muito obrigado pela ateno.
<dt> Obrigado a voc por escolher a Sonho Informtica.
</dialog>

No HTML 5 a tag input sofreu algumas modificaes que facilitaram determinadas operaes. O atributo type ganhou algumas
opes a mais e a tag em si ganhou alguns atributos novos. Ambos
sero apresentados. O HTML 5 implementa validao de campos, a
partir de um atributo chamado required, responsvel por validar
determinados campos. Vale lembrar que para usar determinados
recursos da tag input, a mesma dever estar dentro da tag form,
que representa um formulrio.

O atributo type ganhou algumas opes como tipo de entrada


de dados. So elas: email, time, number, url, tel, datetime e range.
importante lembrar que muitos desses recursos so limitados
a poucos browsers, devido a falta de compatibilidade de alguns
navegadores em relao ao HTML 5.
O campo do tipo email facilitaa validao dos dados informados.
O grande problema que ainda poucos browsers j implementaram esta funo. J o tipo URL, j prepara o campo para receber
um endereo web, inclusive alguns navegadores colocam http://
por padro em campos como esse. Os campos do tipo number s
aceitam nmeros na entrada de dados. Isso j facilita, pois no necessrio criar funes JavaScript que se responsabilizavam por esta
operao. O mesmo acontece para campos do tipo tel, que recebem
apenas nmeros, e ainda podem validar os dados informados. O tipo
range apresenta um controle onde o usurio ir informar o valor por
meio de uma barrinha horizontal, onde cada posio da barra na
linha em que ela pertence, representa um numero diferente, sendo
valores crescentes da esquerda pra direita. J os tipos time e date
time, apresentam controles que controlam as informaes referentes
ao tempo. O primeiro apresenta controle de horas e minutos, e o

Listagem 2. Cdigo da pgina de exemplo montada com o HTML 5


<!DOCTYPEhtml>
<htmllang=pt-br>
<head>
<title>Exemplo de uma pgina desenvolvida com HTML 5</title>
<style>
body
{
font-family: Verdana; font-size: 10;
}
header
{
margin: 0px;
}
headerh1
{
background-color: #20B2AA; font-size: 30px; padding: 10px;
text-align: center;
}
nav
{
background-color: #F4A460; float: left; height: 224px; width: 350px;
}
nava
{
padding: 3px10px3px10px; color: #fff; font-size: 1.4em;
text-decoration: none;
}
nava:hover
{
color: #000;
}
footer
{
background-color: #6495ED; font-size: 10px; font-weight: bold;
clear: both; padding: 5px; text-align: center; color: #000000;
}
section
{
background-color: #DCDCDC; float: right; margin: 0020px0;
padding: 10px; width: 580px;
}
sectionheader
{
background-color: #20B2AA; font-size: 15px; padding: 5px;
margin: 0015px; text-align: center;

48 .NET Magazine Edio 93

}
sectionfooter
{
background-color: #6495ED; font-size: 15px; font-weight: normal;
padding: 5px; text-align: center; color: #000000;
}
#container
{
margin: 0auto; text-align: left; width: 960px;
}
article
{
background-color: #9370DB; margin: 0015px; padding: 1em;
text-align: center;
}
articleimg
{
display: block; margin: 0auto;
}
</style>
</head>
<body>
<div id=container>
<header>
<h1>Exemplo de pgina em HTML 5</h1>
</header>
<nav>
<ahref=#title=Menu da pgina - Item 1rel=alternate>
Menu da pgina - Item 1</a><br/>
<ahref=#title=Menu da pgina - Item 2rel=alternate>
Menu da pgina - Item 2</a><br/>
<ahref=#title=Menu da pgina - Item 3rel=alternate>
Menu da pgina - Item 3</a><br/>
<ahref=http://www.google.com.brtitle=Googlerel=me>
Pesquisar no GOOGLE</a>
</nav>
<sectionid=content>
<header>Cabealho dentro do section</header>
<article>Aqui est a TAG article</article>
<article>Aqui est mais uma TAG article</article>
<footer>Rodap dentro do section</footer>
</section>
<footer>
Desenvolvido por Diego Ferreira - DevMedia - 2011
</footer>
</div>
</body>
</html>

segundo apresenta um calendrio seguido do mesmo controle do


time, controlando as horas e os minutos.
Na tag input agora possvel tornar um campo obrigatrio, e
realizar validaes por expresses regulares nos campos. Para
o primeiro caso, necessrio utilizar o atributo required. Este
atributo pode no receber valor nenhum ou pode ter o valor
required. Para a validao por expresses regulares, necessrio
utilizar o atributo pattern, com o valor da expresso regular que
ser utilizada na validao.
Existem uma srie de outras tags, como datatemplate, que especifica um modelo de dados, details, que define detalhes de um
elemento, ou ainda utilizar a mark para marcar/destacar parte de
um texto. Todas essas novas tags foram criadas para facilitar a vida
de quem trabalha com o HTML. As principais tags foram envolvidas na questo estrutural, no que no tenha se criado outras
tags, mas foi na questo do layout que o cuidado foi maior.
Nota

Salvar estar para provar que o HTML 5 envia informaes para


o servidor normalmente, como nas outras verses.
A Figura 4 mostra como o navegador tratou a validao de um dos
campos. Lembrando que a validao disparada somente quando
a pgina causa uma chamada ao servidor, no caso, quando o boto
salvar for pressionado, ele valida o formulrio. A Listagem 3 mostra
o cdigo final da pgina.

Figura 3. Modelo da pgina que ser montada como exemplo

Na nova verso do HTML 5 surgiu a tag canvas. Com ela possvel desenhar elementos grficos na
tela sem utilizar imagens, porm, os efeitos so feitos via JavaScript. Podem-se desenhar linhas,
retngulos, crculos e muitas outras formas, sem utilizar uma imagem sequer, tudo reproduzido pelo
browser. Como o uso deste recurso um pouco avanado, necessitando de conhecimento prvio da
linguagem JavaScript, s ser mencionada a existncia da tag.

Exemplo prtico: ASP.NET + HTML 5


O ASP.NET uma tecnologia muito utilizada atualmente, no
desenvolvimento de sistemas na plataforma web. Possui muitos
recursos que auxiliam a interao com base de dados e regras
de negcio, utilizando a linguagem C# e/ou VB.NET junto com
o HTML. Ento, a unio de duas poderosas tecnologias como o
HTML 5 e o ASP.NET, resulta em produto de alta qualidade, de
fcil manuteno e de inmeros recursos a serem utilizados.
Para o exemplo prtico ser criado um pequeno cadastro, com
informaes bsicas, sobre um aluno de uma faculdade. Ser utilizado ASP.NET juntamente com o HTML 5. No ter nenhuma
interao com o banco de dados, o exemplo s mostrar que
possvel trabalhar com essas duas tecnologias em conjunto.
O formulrio ter os seguintes campos: nome, CPF, endereo,
cidade/Estado, curso e ano de inicio de curso. Ter tambm, o
boto salvar para enviar as informaes para o servidor tratar os
dados. A Figura 3 ilustra o modelo de como ser o formulrio.
A ideia estruturar a pgina utilizando as tags do HTML junto
com os controles do ASP.NET. Assim, pode se ter interao com
um possvel banco de dados, ou realizar alguma operao que diz
respeito regra do negcio. Nesse caso, seria carregar os cursos
da faculdade ou salvar os dados informados, por exemplo.
A pgina foi toda estruturada utilizando os novos recursos
estruturais do HTML5, com as tags header, footer, section, article
e outras mais. Em alguns campos, como o nome e o CPF, sero
validados como obrigatrio,utilizando os prprios recursos j
implementados no HTML5. E claro que, para obter um melhor
visual, ser utilizado CSS na formatao dos estilos. O boto

Figura 4. Mensagem resultado da validao de obrigatoriedade do campo


Com o cdigo a seguir a ComboBox com os cursos preenchida.
Este trecho executado no evento que disparado quando a pgina
carregada. O cdigo bem simples, preenche uma lista de string
com os nomes dos cursos e realiza o DataBinding com a Combo.
protectedvoid Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
cboCursos.DataSource = new[]
{
Processamento de dados,
Desenvolvimento de jogos,
Produo,
Nutrio,
Administrao,
};
cboCursos.DataBind();
txtAnoInicio.Text = 2011;
txtNome.Focus();
}
}

Concluso
O novo HTML com certeza veio para revolucionar o mundo das
pginas da internet. Com recursos inovadores, que permitem que
muitas coisas sejam feitas somente com HTML, sem a necessidade

Edio 93 .NET Magazine

49

HTML 5

Listagem3. Cdigo da pgina Default.aspx apresentando o HTML5 com ASP.NET

Diego Eduardo Ferreira


diegooferreira@gmail.com
Tecnlogo em processamento de dados na FATEC, trabalha com programao desde 2007 com ASP.NET, Windows Forms, Silverlight e WPF.

D seu feedback sobre esta edio!

D seu voto sobre este artigo, atravs do link:


www.devmedia.com.br/javamagazine/feedback

50 .NET Magazine Edio 93

Feedback
eu
sobre e
s

A Java Magazine tem que ser feita ao


seu gosto. Para isso, precisamos saber
o que voc, leitor, acha da revista!

D
s

de adaptaes com imagens.Por exemplo, o HTML 5 tornou fcil a


tarefa de programar uma pgina.Foram criadas tags que facilitam
a estruturao da pgina, e muitas outras tags que facilitam o uso
de arquivos, como udio, vdeo e imagens.
A grande dificuldade atual de todos os navegadores aceitarem
os recursos dessa nova tecnologia. O Chrome e o Firefox saram
na frente nesta nova inovao. Cabe aos outros navegadores se
adaptarem tambm para receber essa ferramenta que, em pouco
tempo, tomar o mundo da internet.

.combobox
{
margin: 2px2px7px2px; height: 22px; font-family: Tahoma;
}
.label
{
margin: 2px;
}
</style></head><body>
<formid=Form1method=postrunat=server>
<divid=container>
<header>Faculdade DevMedia</header>
<sectionid=content>
<article>
<divstyle=float:left; clear: left;>
<asp:LabelCssClass=labelID=lblNomerunat=serverText=Nome do aluno *>
</asp:Label><br/>
<asp:TextBoxID=txtNomeCssClass=textboxWidth=500pxrequired=required
runat=server></asp:TextBox></div>
<asp:LabelCssClass=labelID=lblCPFrunat=serverText=CPF *></asp:Label><br/>
<asp:TextBoxCssClass=textboxID=txtCpfMaxLength=15required=required
runat=serverWidth=180px></asp:TextBox>
<asp:LabelCssClass=labelID=lblEnderecorunat=serverText=Endereo>
</asp:Label><br/>
<asp:TextBoxCssClass=textboxID=txtEnderecorunat=serverWidth=688px>
</asp:TextBox>
<divstyle=float:left; clear: left;>
<asp:LabelCssClass=labelID=lblCidaderunat=serverText=Cidade>
</asp:Label><br/>
<asp:TextBoxID=txtCidadeCssClass=textboxWidth=500pxrunat=server>
</asp:TextBox></div>
<asp:LabelCssClass=labelID=lblEstadorunat=serverText=Estado></asp:Label><br/>
<asp:TextBoxCssClass=textboxID=txtEstadorunat=serverWidth=180px>
</asp:TextBox>
<divstyle=float:left; clear: left;>
<asp:LabelCssClass=labelID=lblCursorunat=serverText=Curso a frequentar>
</asp:Label><br/>
<asp:DropDownListID=cboCursosCssClass=comboboxWidth=504px
runat=server></asp:DropDownList></div>
<asp:LabelCssClass=labelID=lblAnoIniciorunat=serverText=Ano de incio>
</asp:Label><br/>
<asp:TextBoxCssClass=textboxID=txtAnoIniciorunat=serverWidth=180px>
</asp:TextBox></article>
<footer>
<divstyle=float:left; clear: left; margin-top: 10px;>
<asp:LabelCssClass=labelID=lblPreenchimentorunat=serverText=(*)
Preenchimento obrigatrio></asp:Label></div>
<div><asp:ButtonCssClass=buttonID=btnSalvarrunat=serverText=Salvar>
</asp:Button></div></footer></section><footer>Desenvolvido por
Diego Ferreira - DevMedia - 2011</footer></div></form></body></html>

edio
ta

<%@PageLanguage=C#AutoEventWireup=trueCodeBehind=
Default.aspx.csInherits=ExemploPratico._Default%>
<!DOCTYPEhtml>
<htmllang=pt-brxmlns=http://www.w3.org/1999/xhtml>
<head>
<title></title>
<style>
body
{
font-family: Verdana; font-size: 11px;
}
header
{
height: 50px; border-bottom: 1pxsolid#000; font-size: 30px; font-weight: bold;
text-align: center; padding-top: 15px; margin-left: 10px; margin-right: 10px;
}
sectionfooter
{
border-top: 0pxsolid#000; padding: 5px; margin-left: 0px; margin-right: 0px;
text-align: right;
}
footer
{
border-top: 1pxsolid#000; font-size: 11px; padding-top: 10px; font-weight: bold;
margin-left: 10px; margin-right: 10px;
}
section
{
height: 220px; padding: 10px;
}
body
{
text-align: center;
}
#container
{
margin: 0auto; position: relative; text-align: left; height: 340px; width: 720px;
clear: left; border: 1pxsolid#000; border-top-color: #000; border-left-color: #000;
}
.button
{
font-family: Verdana; width: 100px; height: 30px; background-color: #DCDCDC;
border: 2pxsolid#000; cursor: pointer; font-weight: bold; margin-top: 4px;
}
.button:hover
{
background-color: #6C7B8B; color: #fff;
}
.textbox
{
margin: 2px2px7px2px; font-family: Tahoma;
}

Edio 93 .NET Magazine

51

Seo Boas Prticas: Nesta seo voc encontra artigos sobre as tecnologias que podero aumentar

Princpios de Design de
Aplique os conceitos de SOA
Resumo DevMan
De que se trata o artigo:
O objetivo deste artigo abordar os conceitos da metodologia SOA, um modelo de arquitetura
utilizado principalmente para integrao com outras aplicaes, normalmente aplicado com auxilio
de Web Services.

Em que situao o tema til:


O tema til quando aplicamos uma metodologia conhecida como SOA que procura oferecer uma srie
de recomendaes e boas prticas para a modelagem e a construo de projetos voltados integrao
de sistemas: solues deste tipo so compostas, normalmente, por web services que disponibilizam uma
srie de funcionalidades.

Princpios de Design de Servios:


Muitas organizaes dependem atualmente de um nmero considervel de aplicaes de software,
sendo bastante comum a necessidade de se estabelecer algum meio de integrao entre alguns destes
sistemas. SOA um padro de arquitetura que procura fornecer alternativas neste sentido, com a disponibilizao de funcionalidades em servios (normalmente Web Services): esta abordagem enfatiza o reuso
de componentes de softwares j existentes, assim como procura oferecer uma alternativa que possibilite
a interoperabilidade entre solues construdas nas mais diversas plataformas. Os diversos princpios que
compem a metodologia SOA no foram elaborados para a aplicao por uma tecnologia especfica.
Qualquer plataforma de software que suporte os padres normalmente empregados em projetos SOA
pode ser empregada na construo de solues orientadas a servio.

necessidade de integrao entre


diferentes sistemas computacionais vem sendo uma preocupao
constante ao longo dos anos em muitas
organizaes. O compartilhamento de
dados entre aplicaes representa, em
muitos casos, um fator de importncia
vital para a continuidade de operaes
cotidianas dentro das companhias.
possvel tambm que tal intercmbio de
informaes possa envolver, em determinadas situaes, fornecedores, clientes e
outras entidades externas; cenrios deste
ltimo gnero so classificados como B2B
(Business-to-business).
Arquivos de texto posicionais foram um
dos primeiros meios empregados para a
troca de dados entre aplicaes. Neste tipo
de estrutura as informaes encontram-se

52 .NET Magazine Edio 93

dispostas em linhas e colunas; cada coluna


conta, com um formato e uma posio
especfica. Este tipo de prtica encontrase em uso ainda nos dias de hoje, isto
acontecendo normalmente em aplicaes
voltadas ao ambiente de mainframe. Instituies bancrias tambm se valem deste
recurso com seus clientes corporativos
durante o envio/recebimento de informaes financeiras.
O advento da Internet trouxe novas
alternativas no que se refere ao compartilhamento de informaes entre sistemas.
Com o aumento vertiginoso na velocidade
das telecomunicaes decorrente disto,
muitas organizaes adequaram diversos de seus processos para o tratamento
de transaes em tempo real, agilizando
com isto rotinas que apresentavam um

a qualidade do desenvolvimento de software

Servios
Renato Jos Groffe
comportamento moroso. Anteriormente, a execuo de certas
rotinas ocorria mediante a espera por lotes de informaes, com
o processamento de tais dados ocorrendo em um perodo prdeterminado ao longo do dia.
Web Services foram um dos mecanismos que possibilitaram
esta troca de informaes de maneira praticamente instantnea.
Esse tipo de recurso atualmente um dos principais meios utilizados na integrao de sistemas, sendo que um Web Service
normalmente estruturado a partir do uso de uma srie de formatos
baseados em XML.
Graas ampla aceitao do padro XML na rea de tecnologia, o foco no uso de diferentes formatos fundamentados neste
padro permite, raramente, que Web Services e outros tipos de
aplicaes construdas nas mais diferentes plataformas, possam
se comunicar. Isso garante a interoperabilidade entre sistemas,
assim como maximiza o potencial de reuso de uma soluo baseada em servios. possvel tambm que Web Services utilize
outros formatos de comunicao como o REST.
A utilizao crescente de Web Services, culminou com o desenvolvimento de um novo paradigma para a construo de aplicaes orientadas a servio: metodologia conhecida como SOA. O
objetivo deste artigo discutir, em termos gerais, alguns conceitos
relativos a este padro, bem como abordar princpios que podem
estar sendo tomados como base para projetos que implementem
este modelo. Deve-se ressaltar tambm que solues orientadas
a servios podem ser constitudos por outros tipos de elementos
de software, tais como componentes de mensageria.

Viso geral SOA


SOA (Service Oriented Architecture) - um modelo de arquitetura voltado ao desenvolvimento de solues computacionais.
Dentro desta metodologia, funcionalidades de negcio so implementadas por estruturas conhecidas como servios, sendo que
esta abordagem possui como um de seus principais objetivos,
permitir a integrao entre sistemas construdos nas mais diversas
plataformas (.NET, Java, mainframe etc.).
Importante ressaltar que servios a unidade bsica a partir da
qual solues so construdas dentro deste paradigma. Em termos
prticos, um servio puro e simplesmente um componente de
software que apresenta uma srie de capacidades, com estas ltimas representando operaes (de manipulao de informaes
ou referentes a processos) que correspondem s diferentes funcionalidades contempladas pelo componente em questo.
A exposio de funes de negcio por meio de servios procura

tambm aumentar o reuso de estruturas de software, economizando com isto tempo, recursos financeiros e outros tipos de esforos
que seriam despendidos na construo de novas solues.

Nota do DevMan
REST (Representational State Transfer) um padro no qual recursos so representados por meio
de um endereo nico, atravs do uso de URLs. Objetos contendo dados e que so consumidos por
uma aplicao, constituem exemplos de recursos. Um endereo nico constitudo por informaes de
identificao do recurso esperadas pelo servio que prov o mesmo, bem como por uma indicao da
operao a ser efetuada sobre tal elemento.
Mainframe um computador de grande porte, dedicado normalmente ao processamento de um volume
grande de informaes. Os mainframes so capazes de oferecer servios de processamento a milhares de
usurios atravs de milhares de terminais conectados diretamente ou atravs de uma rede.

Web Services representam atualmente a principal maneira de se


implementar solues orientadas a servio. Componentes deste
tipo fazem uso de algum canal para transmisso de dados, sendo que a Internet ou uma rede corporativa privada representam
exemplos vlidos disto. A preocupao em se promover o uso
de padres, sobretudo, no que se refere Web Services, um
dos principais motivos que conduz opo por uma arquitetura
orientada a servios para a soluo de questes relativas ao compartilhamento de dados entre aplicaes baseadas em diferentes
plataformas.
Importante frisar a existncia do conjunto de especificaes
conhecidas como WS-*: tais padres podem ser aplicados para
regular o funcionamento de Web Services, estipulando uma srie
de comportamentos e padres que conduzam a solues caracterizadas por um grau aceitvel de interoperabilidade.

Benefcios e pontos de ateno ao se implantar SOA


Podem ser enumerados alguns dos principais benefcios da
implantao de solues orientadas a servios:
A possibilidade de integrao (interoperabilidade) entre sistemas
desenvolvidos nas mais diferentes plataformas.
Uma melhor compreenso, assim como uma maior organizao
dos processos de negcio de uma organizao, graas nfase na
anlise e na modelagem da soluo a ser construda;
O reuso de funcionalidades criadas anteriormente, atravs do uso de
servios quando da implementao de novas solues de software;
Reduo de tempo e custos em novos projetos, graas ao foco
no reuso de funcionalidades criadas anteriormente.

Edio 93 .NET Magazine

53

Princpios de Design de Servios

Nota do DevMan
O conjunto de padres chamado de WS-* fruto do esforo conjunto de grandes companhias do
setor tecnolgico (Microsoft, Oracle, IBM, dentre outros). Tal iniciativa busca suportar os heterogneos
ambientes de TI presentes no mundo corporativo, alm de possibilitar uma maior aderncia dos Web
Services construdos a princpios da orientao a servios. So exemplos de especificaes deste tipo:
WS-Security (para a utilizao de mecanismos de segurana); WS-Transaction (empregada no controle
transacional de operaes envolvendo servios).

importante ressaltar que alcanar as vantagens aqui mencionadas envolve um trabalho rduo de anlise, modelagem e desenvolvimento de software. Os diferentes princpios apresentados
mais adiante neste artigo, procuram contribuir neste sentido: a
partir de um conjunto de prticas e recomendaes os envolvidos
em um projeto, podem encontrar orientaes que os auxiliem no
cumprimento dos objetivos traados no escopo inicial.
Alm dos diversos benefcios que SOA oferece, alguns aspectos
devem ser analisados cuidadosamente ao se optar por esta arquitetura em projetos de software:
Ao se construir solues baseadas neste modelo deve-se contar
com uma equipe capacitada e familiarizada com os conceitos de
orientao a servios;
Mudanas drsticas no contrato de um servio podem prejudicar
a operao normal de aplicaes que consumam o mesmo;
Pelo fato de servios envolverem a transmisso de dados a partir
de redes, a segurana um ponto que sempre ir requerer ateno
especial, sobretudo quando envolver a manipulao de informaes confidenciais (senhas, nmeros de cartes de crditos etc.);
Servios devem ser empregados primariamente na integrao
entre diferentes sistemas. Caso um determinado conjunto de funcionalidades jamais venha a ser reaproveitado por outras aplicaes
alm do projeto ao qual estavam elencadas inicialmente, no se
justifica disponibilizar tais funes como servios (j que est se
aumentando com isto a complexidade da soluo resultante).

Tipos de Servios
Uma boa prtica ao se implementar um projeto baseado em
SOA, aplicar o princpio de separao de responsabilidades
(separation of concerns) na modelagem dos servios que iro
compor a soluo. Por meio deste conceito procura-se a obteno
de componentes de software dotados de uma maior coeso, com
as capacidades correspondentes condizendo com o propsito para
o qual cada um dos servios foi concebido. Tomando por base isto,
servios podem ser divididos nas seguintes categorias:
Entity Services: implementao de um padro conhecido como
Entity Abstraction, sendo empregados na manipulao de dados
de entidades de negcio em operaes do tipo CRUD (incluso,
excluso, alterao e/ou consulta a informaes referentes a um
item de negcio);
Utility Services: baseiam-se no pattern Utility Abstraction, estando normalmente voltados ao fornecimento de funcionalidades
no relacionadas diretamente a processos de negcio (log, envio
de notificaes via e-mail etc.);

54 .NET Magazine Edio 93

Task Services: formados por capacidades que equivalem forma automatizada de processos de negcios, contando com uma
lgica de processamento na qual h o consumo de Entity e/ou
Utility Services;
Orchestrated Task Services: envolvem lgica de orquestrao,
ou seja, coordenam o fluxo de execuo em composies formadas por outros tipos de servio (Task, Entity e Utility Services).
Apresentam semelhanas com os Task Services, muito embora
consumam servios deste tipo por estarem num nvel de abstrao mais alto.
Nota
Utility Abstraction um design patterns aplicado na orientao a servios.

Princpios de Design de Servios


Os princpios de design de servios listados a seguir e que sero
discutidos em maior profundidade nas prximas sees procuram
oferecer orientaes de como solues baseadas em SOA podem
ser estruturadas, a fim de que com isto possam ser alcanadas as
metas traadas para tais projetos:
Contrato padronizado;
Acoplamento;
Abstrao;
Reusabilidade;
Autonomia;
Independncia de estado;
Visibilidade;
Capacidade de composio.
Cada princpio conta com uma srie de recomendaes que
definem caractersticas a serem levadas em conta na modelagem
de aplicaes orientadas a servio. Cuidados e pontos de ateno
tambm so considerados dentro de tais fatores, de maneira que
possam ser identificados, e mesmo mensurados possveis riscos
dentro de um projeto.

Contrato Padronizado
Dentro de SOA uma premissa bsica a de que todo servio deve
contar com um contrato correspondente. Este ltimo elemento
no apenas define a estrutura do servio em questo, como tambm rege tudo o que feito por tal componente. Alm disso, a
partir de um contrato que os consumidores das funcionalidades
sabero de que maneira iro se comunicar com o servio do qual
dependem.
Levando em conta a necessidade de coexistncia entre solues
concebidas nas mais diferentes plataformas, imprescindvel que
o contrato de um servio siga alguns padres de ampla aceitao
na rea de tecnologia. A partir disto, torna-se possvel estabelecer
um meio atravs do qual ocorrer a troca de informaes entre um
servio e outras aplicaes que consumam o mesmo, garantindose atravs das convenes empregadas a interoperabilidade entre
os sistemas envolvidos.

Quando se considera a implementao de uma arquitetura


orientada a servios por meio do uso de Web Services, os seguintes padres baseados em XML so comumente empregados na
definio dos contratos de servios:
Web Services Description Language (WSDL): utilizado na descrio da interface de um servio. Atravs do mesmo, aplicaes
consumidoras podem gerar proxies com o intuito de utilizar as
funcionalidades disponibilizadas via Web Service;
XML Schema Definition Language (XSD): especificao empregada na definio (schema) dos diversos tipos de objetos
manipulados por um Web Service. Documentos no formato XSD
encontram-se normalmente referenciados em descries WSDL
de contratos de servios;
WS-Policy: linguagem que possibilita a representao de caractersticas e requisitos a serem considerados na utilizao das
funcionalidades de um Web Service.
Alm de todo o aparato tcnico presente na especificao de
um contrato, tambm bastante comum que se estipulem SLAs
(Service-level agreements,) para estas estruturas: tal prtica busca firmar um compromisso entre o provedor de um servio e os
consumidores deste, a fim de que se garanta um grau mnimo de
compatibilidade no intercmbio de informaes.

Acoplamento
O acoplamento um conceito que est relacionado dependncia que se estabelece entre diferentes componentes de software,
inseridos num determinado contexto. Como mudanas so uma
constante dentro da rea de desenvolvimento de sistemas, um
baixo nvel de acoplamento entre as diferentes partes envolvidas
em um cenrio algo desejvel, j que com isto so minimizados
os impactos introduzidos por alteraes.
A opo por um contrato padronizado e que sirva de base para o
consumo de um servio impede em grande parte dos casos, que se
criem relacionamentos entre detalhes de implementao (lgica interna, tecnologia, infraestrutura associada etc.) do componente em
questo e seus provveis consumidores. Isto no quer dizer que no
existir nenhuma forma de acoplamento (embora possa ser fraco),
visto que o cliente de um servio sempre depender do contrato
fornecido para o mesmo nas diversas interaes esperadas.

Abstrao
O conceito de abstrao dentro da orientao a servios derivado de outro princpio muito conhecido na rea de desenvolvimento de software: a ocultao de informaes. O objetivo da abstrao
disponibilizar aos consumidores de um servio, apenas o que
essencial no uso do mesmo, com isto acontecendo no contrato que
define o componente. Detalhes especficos relativos infraestrutura empregada (servidores de bancos de dados, mecanismos de
controle de acesso etc.) so ocultados das aplicaes-clientes, com
o servio funcionando como uma caixa-preta.
Diversos so os fatores que justificam a aplicao deste princpio.
A segurana um dos motivos para a adoo de tal prtica, uma

vez que um servio com um contrato conciso pode atuar como


uma barreira no acesso a determinados tipos de informaes:
cobe-se o acesso indevido a dados e outros recursos que devem
permanecer restritos, devido a regulamentos prprios da organizao em questo.
Outro motivo que atesta a importncia deste princpio est na
necessidade de se limitar o conhecimento acerca da estrutura de
um servio. Com isto se evita que consumidores faam pr-julgamentos sobre o mesmo, e a partir de suposies, possam utilizar
erroneamente alguns dos recursos oferecidos, ou mesmo, burlar
procedimentos que eram esperados numa situao normal.

Nota do DevMan
Um Proxy uma classe baseada em um padro de projeto de mesmo nome e que oferece atravs
da forma como se encontra estruturada, um meio de encapsular uma srie de instrues complexas
acionadas na invocao de um servio remoto. Neste caso, essas operaes so executadas apenas
quando necessrio se consumir uma funcionalidade do servio que se est considerando, simplificando
e tornando mais eficiente o processo de comunicao remota com tal componente.

Reusabilidade
Conforme j mencionado neste artigo, o modelo SOA d uma
grande nfase ao reuso de componentes de software. O reaproveitamento de funcionalidades construdas anteriormente pode, via
de regra, traduzir-se em um maior retorno sobre o investimento
inicial que foi empregado na concepo das mesmas. Alm disso,
novas solues podem ser desenvolvidas com maior agilidade,
consumindo recursos j implementados anteriormente, bem
como economizando tempo e recursos que seriam empregados
em tais projetos.
Quando se considera a lgica relativa a processos de negcio,
servios que no estejam diretamente relacionados coordenao
de tais atividades e ao controle das diversas regras existentes, so
chamados de agnsticos. Este o caso dos Entity e dos Utility
Services: devido finalidade a qual se prestam, servios deste
tipo podem ser mais facilmente reutilizados. Por outro lado, o
potencial de reuso diminui com estruturas como Orchestrated
e Task Services, uma vez que tais componentes esto voltados a
contextos bem mais especficos.
Ao se levar em conta necessidades imediatas e futuras na construo de servios, o reuso pode ser categorizado em:
Capacidade de reuso ttica: apenas funcionalidades iniciais
para o momento so implementadas, em resposta necessidade
imediata de se atender a uma determinada demanda;
Capacidade de reuso dirigida: um processo de anlise orientada
a servios foi efetuado, com a identificao de capacidades de
uso imediato, ou ainda, possveis de serem consumidas a curto
ou mdio prazo;
Capacidade de reuso completa: servios so implementados com
uma ampla gama de funcionalidades, tentando-se com isto, no
apenas atender necessidades do momento, como tambm prever

Edio 93 .NET Magazine

55

Princpios de Design de Servios

o maior nmero de situaes futuras de utilizao. Recomenda-se


a opo por tal abordagem apenas quando houver maturidade de
equipe de projetos para com o padro SOA.

Autonomia
A ideia por trs do princpio de autonomia est relacionada, fundamentalmente, a quo independente um servio de influncias
externas quando a lgica inerente ao mesmo executada. Outra
analogia que se pode fazer para explicar este conceito, seria a de
que um servio autnomo que capaz de autogovernar-se.
Levando tais aspectos em considerao espera-se, sempre que
possvel, que servios possuam um nvel mais alto de autonomia.
Geralmente isto conseguido com implementaes dotadas de
maiores graus de independncia e de isolamento no que se refere
a elementos externos. Alm disso, uma maior autonomia se traduz
no aumento da confiabilidade de um servio, assim como numa
maior previsibilidade do comportamento deste.
Contudo, nem todos os tipos de servio contaro com graus
mais elevados de autonomia. Um exemplo disto a composio
de servios, em que se perde naturalmente autonomia: a partir
da combinao de vrios componentes pr-existentes obtm-se
um novo servio, no qual passar a depender de tais estruturas
para a execuo de sua lgica de processamento.
Existem dois tipos principais de autonomia que podem estar
associadas a servios:
Autonomia em run-time;
Autonomia na etapa de design;
A autonomia em run-time representa, em termos gerais, o nvel
de controle que um servio possui sobre o seu ambiente de execuo. Logo, dentro desta classificao esto contemplados aspectos
como possveis dependncias do servio para com outros componentes de software, alm de outras questes como segurana,
desempenho, previsibilidade e confiabilidade.
J a autonomia na etapa de design est ligada s dependncias
que se estabelecem entre um servio e seus consumidores. Neste
caso, o grau de autonomia do servio considerado determinar se
este poder ou no modificar suas definies de contrato, alterar
o ambiente de hospedagem utilizado, optar pela substituio
de recursos empregados, ou mesmo introduzir o uso de novas
tecnologias, dentre outros pontos.
Quando se toma por base a classificao de servios por tipos, Entity
e Utility Services so estruturas que contam com uma maior autonomia. Em contrapartida, Task Services e Orchestrated Task Services
so exemplos de componentes com menos autonomia, uma vez que
os mesmos so resultantes de composies de outros servios.

Independncia de Estado
Antes de iniciar a discusso sobre o princpio a ser descrito nesta
seo, deve-se definir o que significa o termo conhecido como escalabilidade. Um sistema dito escalvel quando capaz de se adequar a uma demanda crescente no seu uso, sem que com isto deixe
de corresponder ao que se esperava inicialmente do mesmo.

56 .NET Magazine Edio 93

J o conceito de estado refere-se manuteno de informaes


compartilhadas entre uma aplicao-cliente e o servio do qual
esta depende, com isto acontecendo durante um perodo de
tempo que engloba diversas trocas de mensagens entre estes
dois elementos.
O armazenamento sem critrio de informaes de estado
em memria pode em um determinado ponto, comprometer a
disponibilidade de um servio, pondo inclusive em cheque sua
escalabilidade. Problemas como estes, so normalmente decorrentes de um maior grau de utilizao do servio considerado,
causando a sobrecarga de servidores e podendo se agravar ainda
mais com um incremento no nmero de acessos simultneos, ao
componente em questo.
Manter ou no dados relativos a estados em memria depender
sempre do contexto e das premissas esperadas para um determinado servio. O princpio da independncia de estado procura
oferecer alternativas para maximizar a escalabilidade de um
servio, delegando a outros meios o gerenciamento temporrio
de algumas informaes.
bastante comum que bancos de dados sejam empregados como
mecanismo para o controle de informaes de estado. Ao se delegar este tipo de tarefa a outro dispositivo, chega-se a um melhor
gerenciamento dos dados de estado, evitando-se at possveis
sobrecargas do servidor responsvel por cuidar das mltiplas
instncias de um servio.
Outro benefcio advindo de um controle de estados eficaz est na
possibilidade de se aumentar o potencial de reuso de um servio, j
que o mesmo conta neste caso com um comportamento estvel. Isto
um aspecto desejvel quando se considera que tal servio poder
ser reaproveitado no apenas por aplicaes consumidoras, como
tambm em novas composies envolvendo a obteno de um servio
orquestrador que interage com outras estruturas do mesmo tipo.

Visibilidade
O conceito de visibilidade diz respeito capacidade um servio ser descoberto, e a partir disto, ter as informaes que
definem sua estrutura interpretada por potenciais utilizadores
do mesmo. Tais informaes envolvem elementos do contrato
do servio que se est considerando, assim como outros itens
de metadados que estipulam o comportamento das diversas
operaes disponibilizadas.
Para que a descoberta torne-se possvel, comum que se faa uso
de um procedimento conhecido como registro de servio. Uma
das primeiras especificaes empregadas neste sentido foi a UDDI
(Universal Description Discovery and Integration), a qual representa um padro para registro e localizao de Web Services.
Atualmente, costuma-se utilizar a especificao conhecida
como WS-MetadataExchange neste tipo de processo. Por meio
desta ltima, so fornecidos meios para que o consumidor de
um servio seja capaz de recuperar, via programao, a verso
mais atual dos documentos correspondentes ao contrato de tal
servio, checando inclusive em tempo de execuo a verso atual
das informaes de metadados.

Pode-se concluir a partir do que foi exposto,


que a finalidade do princpio de visibilidade
est em fornecer um mecanismo que permita que um servio seja encontrado, e uma vez
que isto acontea, possa ter suas diferentes
caractersticas interpretadas. Busca-se com
isto determinar se o servio atende a uma
determinada necessidade, para em caso
afirmativo, prosseguir com a utilizao do
mesmo em uma aplicao-cliente.
Na Figura 1 est uma representao esquemtica dos processos relacionados ao
princpio descrito nesta seo.
Nota
Maiores informaes sobre as notaes e padres utilizados ao
longo deste artigo podem ser encontrados no siteWhat is SOA?,
cujo endereo encontra-se listado na seo de links. Este site
disponibiliza ainda um conjunto de smbolos para a modelagem
de servios atravs da ferramenta Visio da Microsoft.

Capacidade de Composio
O conceito de composio est associado
diretamente a outro fator j discutido ao
longo deste artigo: o reuso de servios.
A gerao de novos servios a partir de
outros componentes j existentes pode
se revelar como bastante benfica em um
projeto; esta prtica resulta muitas vezes
na reduo do tempo de desenvolvimento,
assim como numa economia substancial
de recursos financeiros, j que parte, neste
caso, do reaproveitamento de funcionalidades construdas anteriormente.
Uma composio envolve pelo menos
dois servios, sendo que normalmente
um destes componentes atuar como controlador da mesma, servindo deste modo
como ponto de partida para o consumo
das novas funcionalidades que esto sendo
implementadas. Utility e Entity Services
so normalmente empregados como membros de uma composio, ao passo que
Task Services e Orchestrated Task Services
assumem o papel de controladores.
Composies podem ser de dois tipos:
Primitivas;
Complexas.
Uma composio primitiva envolve a
troca simplificada de mensagens entre
dois ou mais servios (Figura 2).

Figura 1. Representao esquemtica do conceito de visibilidade do servio

Figura 2. Exemplo de composio de servios primitiva

Figura 3. Exemplo de composio de servios complexa


J uma composio complexa conta com
uma lgica mais sofisticada, representando normalmente um processo de negcio
(Figura 3). Uma boa prtica ao se modelar
um servio composto dividir as partes
que constituem tal estrutura em camadas
lgicas de abstrao, considerando-se
como critrio de separao os diversos
tipos de funcionalidades envolvidos em
tal processo. Esta abordagem est em conformidade com um pattern SOA conhecido
como Service Layers. Assim, so possveis
dentro de um projeto SOA as seguintes
camadas:

Task Service Layer: formada por servios


dos tipos Task Services e Orchestrated
Task Services;
Entity Service Layer: ponto de agrupamento de Entity Services;
Utility Service Layer: camada constituda
por Utility Services.
Espera-se dentro de um contexto ideal,
que Entity e Utility Services no tenham
conhecimento por si s da existncia de
outros tipos de servio, possibilitando
assim um aumento no potencial de reutilizao dos mesmos. Em contrapartida,

Edio 93 .NET Magazine

57

Princpios de Design de Servios

praticamente certo que em determinado momento, se far


necessrio o estabelecimento de algum meio de integrao entre diferentes sistemas, quer seja internamente dentro de uma
organizao, ou ainda, entre aplicaes da mesma e terceiros
(fornecedores, clientes, rgos governamentais etc.).
Este artigo procurou abordar, atravs de conceitos que compem
a metodologia SOA diretrizes que podem ser tomadas como guias
neste sentido. Os diversos temas discutidos englobam uma srie
de padres e aspectos tcnicos de eficcia comprovada dentro
da rea de tecnologia, servindo como base para a construo de
solues seguindo uma arquitetura orientada a servios.
No entanto, os princpios aqui apresentados no devem ser encarados como uma frmula mgica que possibilitam a obteno
de uma soluo SOA bem delineada. Tal meta ser alcanada
apenas atravs de um rduo trabalho de anlise e modelagem,
ponderando-se para isto o que estar disponvel por meio de
servios num primeiro momento, alm do potencial futuro de
reutilizao de tais funcionalidades de negcio.

58 .NET Magazine Edio 93

Solues SOA (Arquitetura Orientada a Servios)


http://www.sensedia.com/br/soa
SOA Glossary
http://www.soaglossary.com/
SOA Methodogy
http://www.soamethodology.com/
SOA Patterns
http://www.soapatterns.org/
What is SOA?
http://www.whatissoa.com/default.php

D seu feedback sobre esta edio!


A Java Magazine tem que ser feita ao
seu gosto. Para isso, precisamos saber
o que voc, leitor, acha da revista!
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/javamagazine/feedback

Feedback
eu
sobre e
s

Renato Jos Groffe


renato.groffe@yahoo.com.br
Atua como consultor em atividades voltadas ao desenvolvimento
de softwares h mais de 10 anos. Bacharel em Sistemas de
Informao, com especializao em Engenharia de Software. Microsoft
Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.
NET, Windows Forms), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD),
ITIL Foundation V2.

Manifesto SOA
http://www.soa-manifesto.org/default_portuguese.html

D
s

Concluso

Aquele blog de SOA


http://www.aqueleblogdesoa.com.br/

edio
ta

ser comum que componentes localizados na Task Service Layer


possuam tal conhecimento, sendo a justificativa disto o fato de
tais servios serem obtidos por meio de composies.

Edio 93 .NET Magazine

59

Seo Boas Prticas: Nesta seo voc encontra artigos sobre as tecnologias que podero aumentar

Design Patterns com .NET


Model View Presenter

ecentemente conclu uma srie de


trs artigos nesta revista tratando
de boas prticas em programao
com C# e o Framework .NET. Dois destes
eram sobre a separao da aplicao em
camadas e isso tem uma boa razo: no d
mais para continuarmos criando programas com os paradigmas antigos.
A ideia de ver janelas onde voc arrastava os controles visuais e escrevia
pouco cdigo est cada vez mais saindo
de prtica. Em vez disto, o foco est sendo aprender a escrever cdigos e nem
sinal de janelinhas com controles.
A tendncia agora ter pouca coisa feita
automaticamente pelas IDEs como o
Visual Studio.
O paradigma da poca era desenvolver
aplicaes com aparncia profissional
da maneira mais rpida.
No havia necessidade de se portar a
aplicao para outras plataformas, mesmo
porque, at a dcada de 1990 nem eram
tantas as plataformas existentes. Logo, este
problema no existia e nasceram ento as
linguagens visuais (sic).
Uma forte caracterstica destas linguagens era a maneira como o cdigo era escrito geralmente respondendo a eventos
disparados nos controles visuais. Este tipo
de abordagem e padro de desenvolvimento chamado de code behind, ou seja,
por trs de um design existe cdigo sendo
executado. Esta forma de escrever o cdigo
acaba agregando tanto regras relacionadas
com os dados da aplicao como aquele
necessrio para controlar os aspectos de
aparncia da aplicao.
Tambm havia uma forte ligao dos
controles com os dados. No Framework
.NET voc pode conectar diretamente
os controles com os dados atravs das
propriedades de data binding, definindo
uma fonte para estes, configurando qual a

60 .NET Magazine Edio 93

Resumo DevMan
De que se trata o artigo:
O artigo mostra o design pattern MVP ou Model (modelo de dados), View (interface do usurio) e Presenter (regras para a apresentao). No incio realizado um embasamento terico e no final realizado
comparaes com outros padres como MVC e MVVM.

Em que situao o tema til:


Os designs patterns ajudam os desenvolvedores a manterem um padro de qualidade em suas criaes
tornando o processo de criao mais regular e organizado. Com o MVP o desenvolvimento de aplicaes
voltadas interface com o usurio podem se beneficiar das vantagens de separar lgica da apresentao
e adicionar um terceiro elemento que torna possvel reaproveitar as regras usadas para compor a apresentao dos dados em tipos de projetos distintos como uma aplicao Windows e outra em ASP.NET.

Model View Presenter:


Uma preocupao constante dos desenvolvedores reaproveitar o cdigo. Com o surgimento de novas
plataformas para suas aplicaes como as executadas em browsers e em dispositivos mveis torna-se
muito difcil reusar as regras para apresentao dos dados em cada tipo de interface.
Com a evoluo do Framework .NET evoluram tambm os padres para desenvolvimento. O MVP foi
uma das propostas iniciais para promover a separao entre as camadas de apresentao, dados e regras
de negcio sendo seguido por outros. O MVP se baseia em trs elementos, Model, para a definio da
estrutura e comportamento dos dados e eventuais regras aplicadas nestes, View que faz a apresentao
dos dados e Presenter que serve como intermedirio entre os dois elementos, estabelecendo alguns
padres para apresentao destes. Com este design pattern o desenvolvedor deve ser capaz de criar uma
aplicao que possa ter tipos de interface distintos como aplicaes Windows Forms ou Web.
Uma das principais caractersticas a diviso de parte da responsabilidade de compor a apresentao
entre o Presenter e a View atravs do uso de interfaces. Desta forma, a View pode adaptar as definies
do Presenter as suas caractersticas. No s de flexibilidade e possibilidade de portar as aplicaes para
outras plataformas que vive o MVP. H outras vantagens, por exemplo, aumentar a possibilidade de se
executar testes automatizados (em se tratando de Test Driven Development ou TDD). Antes de adotar
um design pattern algumas consideraes precisam ser feitas como o aumento significativo do tempo de
desenvolvimento e dos passos necessrios para se ter a aplicao funcionando. Estas consideraes sero
abordadas juntamente com um exemplo prtico demonstrando o uso do MVP em uma aplicao.

propriedade est vinculada com o controle


e tambm o comportamento em respostas
a determinados eventos.
Dentro do contexto em que surgiram estas facilidades fazem todo o sentido. Quando h pouca necessidade de portabilidade
da aplicao e esta projetada para permanecer vinculada com uma plataforma,
no ser necessrio se preocupar com sua

arquitetura. Ainda que prover a separao


entre as camadas lgicas do projeto seja
uma boa prtica, impacta diretamente na
necessidade de manuteno e de evoluo
da aplicao, existem muitos casos onde
esta prtica no adotada.
importante observar que isto uma
parte da histria e que d um contexto
para se entender como as linguagens de

a qualidade do desenvolvimento de software

T - Parte 1
Vladimir Rech
programao eram pensadas e quais os problemas que estas
resolviam (ou pretendiam resolver).
Entretanto, atualmente o cenrio diferente e no aceitvel mais
abordar o desenvolvimento de software com estes tipos de prticas.

Design Paterns
comum que uma determinada aplicao tenha seus pontos
de interao com o usurio em diversos tipos de plataformas e
dispositivos, sendo o cenrio mais conhecido aquele onde h uma
interface baseada em um aplicativo desktop para os usurios acessarem de dentro da empresa e outra sendo executada no browser,
para ser acessada de fora.
Ainda no existe uma forma de se escrever uma interface uma vez
e execut-la em qualquer tipo de dispositivo ou plataforma, obtendo-se os mesmos resultados em termos de usabilidade e recursos.
Muito embora, as interfaces baseadas em browsers tem entregado
boa parte desta portabilidade, h muito que ser feito e provavelmente sempre vai haver um lapso entre os dispositivos, principalmente
dada a sua natureza e forma de operao. Considere acessar uma
aplicao ERP usando um smartphone, por exemplo.
Existem outros problemas alm da portabilidade:
1. Dificuldade em realizar testes automatizados, pois no possvel fazer simulaes com a camada de apresentao.
2. Quando for necessrio fazer mudanas na camada de apresentao, tambm ser necessrio alterar o cdigo j que diferentes
elementos de interface possuem diferentes maneiras de manipular
os eventos (event handlers).
Um design pattern rene prticas e maneiras de se elaborar um
projeto de software para promover solues para estes e outros
problemas.
Os mais usados so aqueles que possibilitam uma clara separao entre as camadas de um projeto e permitem sua rpida
adaptao para novas necessidades.
Em se tratando de design patterns para o desenvolvimento de
aplicaes, o MVP se encaixa quando h necessidade de separar a
estrutura dos dados, criar uma lgica para sua apresentao que
seja consistente em diversos cenrios e conectar isso tudo ao tipo
de interface que est sendo usado.

Sobre o que se trata MVP


Atualmente este no muito citado, tendo cedido espao para
outros design patterns como o MVC e o MVVM, especialmente em
aplicaes desenvolvidas com o Framework .NET. um dos pri-

meiros padres a se estruturar dentro deste e terem as suas regras


definidas. ainda uma boa opo para ser feita quando se est pretendendo iniciar a adoo destes no desenvolvimento de aplicaes
e se tem ainda pouco conhecimento ou, como em muitos casos, se
est bastante confuso sobre qual a alternativa adequada.
Tambm muito fcil de ser entendido por programadores acostumados com o code behind, sendo que uma parte do cdigo ainda
vai presente na camada de apresentao (View). Este cdigo, por
outro lado, no se refere mais as regras vinculadas com os dados,
mas, exclusivamente usado para controlar aspectos particulares
da camada de apresentao como manipular elementos visuais
aplicando a estes as regras definidas na camada Presenter.
O MVP separa as tarefas em trs camadas:
1. MODEL - responsvel pelos dados e eventuais validaes destes.
O mais comum ser representado pelas classes para estruturar
os dados e determinar algumas de suas regras de negcio.
2. VIEW - que faz a apresentao destes para o usurio. Vai ser definida usando elementos particulares de cada plataforma como pginas
ASP.NET, formulrios Windows, pginas WPF e assim por diante.
Em MVP comum que haja algum cdigo necessrio para responder
a eventos dos elementos visuais e construo da interface.
3. PRESENTER a camada que obtm os dados da camada
Model, aplica regras que sero usadas para sua apresentao tais
como mensagens de validao e algum tipo de formatao que
precisar ser padronizado e as envia para a camada View.
Neste pattern a camada de apresentao (View) recebe as entradas e modificaes feitas pelo usurio e as encaminha para
o Presenter. Este modifica a camada Model (dados) ou da View
dependendo das aes do usurio.
As camadas View e Presenter so fortemente ligadas, sendo a
sua comunicao bidirecional.

Comparao com outros patterns


Para os que j conhecem MVC e MVVM, pode haver uma
curiosidade em saber qual a diferena entre estes e o MVP. Para
quem no conhece, importante salientar que os mesmos sero
abordados nos prximos artigos desta srie.
O pattern MVC se baseia em trs elementos: primeiramente o
Controller que obtm todas as solicitaes dos usurios. A partir
destas e dependendo da sua natureza, ele pode mostrar uma View
adequada ou realizar modificaes nos dados (Model). Os elementos View e Model so criados pelo Controller. O View conhece o
Model, mas, este no conhece os outros objetos.

Edio 93 .NET Magazine

61

Design Patterns com .NET - Parte 1

Este padro deve ser usado em aplicaes Web, sendo que o Visual Studio 2010 oferece templates para sua rpida implantao.
Reforando o que foi colocado, o contedo de cada elemento
o seguinte:
MODEL: contm toda a parte lgica da aplicao que no est
definida nas demais partes. Inclui rotinas de validao, regras de
negcio, cdigo para acesso e persistncia dos dados. Tambm
contm as classes de dados da aplicao.
VIEW: contm marcaes HTML e a lgica para compor a
apresentao.
CONTROLLER: contm a lgica para o fluxo do controle da aplicao. O Controller interage com os outros elementos controlando
o fluxo da execuo da aplicao.
O design pattern MVVM mais comum em aplicaes WPF e
processa as entradas do usurio encaminhando para a camada
ViewModel basicamente usando os Commands do WPF. A camada
View preenche os controles com os dados usando data binding
de uma maneira distinta daquela que feita. Novamente, cada
elemento responsvel por uma tarefa especfica:
MODEL: assim como no padro MVC possui a definio dos
dados, classes e lgica para modificao destes.
VIEW: formatao da interface com o usurio.
VIEW MODEL: responsvel pelas validaes, regras e cdigo
para responder s aes do usurio na VIEW.

Usando na prtica
Agora, para por em prtica todos estes conceitos, ser criado um
projeto de exemplo.
Basicamente desenvolvi uma aplicao que faz um login fake.
Seus principais requisitos so:
1. O usurio deve informar um id e uma senha.
2. Ao clicar no boto Send, estes dados so validados.
3. No projeto o usurio vlido user e a senha p4ssw0rd.
4. Se estes dados forem vlidos, isto , informados corretamente
a interface vai apresentar uma mensagem em um fundo azul
dizendo Access granted..
5. Por outro lado, caso no seja validado, deve aparecer mensagem Access denied na cor amarela.
6. Por fim, isto deve estar disponvel tanto em aplicaes Web
como Windows Forms.
A Figura 1 demonstra como ficou o formulrio Web sem os
dados preenchidos.

Figura 1. Formulrio de login Web


O desafio fazer a mesma coisa com um projeto Windows forms
sem ser necessrio reescrever as regras para a apresentao.

62 .NET Magazine Edio 93

Nota do DevMan
Uma forma de mover toda a lgica da camada de apresentao usando uma caracterstica do WPF
chamada Commands. Estes podem ser ligados com os elementos da interface como se fossem dados.
Assim possvel eliminar completamente o cdigo desta camada.

A Figura 2 demonstra o login sendo recusado nesta interface.

Consideraes sobre o projeto


importante acima de tudo, observar que se trata de uma aplicao feita apenas para demonstrar um conceito, logo, no vou incluir
nenhum tipo de tratamento de erro ou ainda consideraes sobre
bancos de dados que esto sendo utilizado, formas de acesso etc.

Figura 2. Login rejeitado


A classe que faz o trabalho de login muito simples, servindo
apenas para retornar um resultado de uma operao.
Um ponto de ateno importante quando voc for aplicar os
conceitos em seus projetos est na complexidade. Aqui, estou
implantando poucos requisitos, considere a complexidade de se
fazer isto em uma aplicao completa, com inmeros tipos de
dados, campos, domnios etc.
Foi utilizado o .NET Framework 4.0, mas, para este projeto em
particular, possvel usar verses anteriores.
Para deixar mais claro ainda a separao de cada elemento, optei
por criar uma soluo vazia no Visual Studio 2010 chamada mvp.
Em seguida adicionei quatro projetos distintos, sendo cada um
responsvel por uma parte:
1. Projeto mvp.model: responsvel pela modelagem dos dados.
Trata-se de um projeto do tipo class library e vai representar como
o prprio nome sugere a camada Model.
2. Projeto mvp.presenter: define a camada Presenter. Faz a
formatao das mensagens e das cores que sero enviadas para a
interface aps a validao do Login.
3. Projeto mvp.web e mvp.windows: implementam a camada
View. Contm os elementos de interface apropriados a cada tipo
especfico.
O projeto mvp.model precisa ser referenciado pelo mvp.presenter e estes dois pelos projetos responsveis pela View.
A Figura 3 mostra estes projetos exibidos na janela Solution
Explorer do Visual Studio.

de dado suportado pelo Framework e pelos tipos de interface


visual que podem ser usados.
Listagem 1. A classe de login

Figura 3. Projetos criados


Nota
Voc deve criar os projetos utilizando uma Class Library do Visual Studio.

namespace mvp.model
{
public class Login
{
public static bool DoLogin(string userId, string password)
{
return userId == user && password == p4ssw0rd;
}
}
}

Criando o Model

Listagem 2. A interface de apresentao

Este projeto contm a classe que vai efetuar a validao dos dados
enviados pelo usurio. A Listagem 1 demonstra esta classe.
O cdigo possui apenas um mtodo que recebe os dados do
usurio e retorna o resultado comparando com valores previamente estabelecidos.
Em uma aplicao do mundo real, esta classe deve conter os
campos de dados (propriedades) e mtodos que iro fazer operaes com os dados.
Alm disto, devem ser feitas consideraes sobre como os dados sero persistidos. O que pode elevar ainda mais a sua complexidade.
Como este projeto est separado e o resultado final um assembly
(DLL) do Framework .NET possvel reaproveitar este mdulo
em outros projetos.

namespace mvp.presenter
{
public interface ILoginPresenter
{
void validateLogin(bool doLogin);
}
}

Definindo o Presenter
Este mdulo, representado pelo projeto mvp.presenter o mais
complexo em termos de entendimento e tambm o que apresenta
o aspecto mais importante no design pattern.
A Listagem 2 descreve o principal elemento de comunicao
entre a View e o Presenter.
A utilizao de uma interface em C# possibilita que a camada
View decida como ir aplicar as regras definidas pelo Presenter.
Neste exemplo, a camada View responsvel por implementar
o mtodo validateLogin, logo, tanto a pgina ASP.NET como o
formulrio Windows devem herdar esta interface.
Este mtodo precisa receber o resultado do login, previamente
processado pela classe da camada Model.
Na Listagem 3 est definida a classe que define as regras da
camada de apresentao.
Esta classe mantm um objeto que deve se derivado da interface
ILoginPresenter, definida anteriormente. Este objeto ser o prprio formulrio Windows ou ASP.NET, uma vez que estes devem
ser implementaes da interface.
A classe ir interagir com a interface atravs deste objeto.
As propriedade backgroundColor da linha 9 define a cor usada
pelo controle que apresenta o resultado da operao. Esta classe
no sabe em qual controle esta cor ser usada e se realmente ser
uma cor de fundo (background). Neste exemplo, poderiam ser
definidos outros elementos como imagens e qualquer outro tipo

A propriedade backgroundText (linha 10) refere-se a mensagem


enviada para o usurio e tambm no cuida de qual o tipo de
controle que ser usado para sua apresentao.
O mtodo add da linha 12 vincula o objeto da interface grfica
com a classe para poder realizar sua manipulao.
E finalizando a classe, o mtodo executeLogin da linha 16 obtm
o resultado do login j efetuado e configura tanto a cor como a
mensagem que apresentada para o usurio.
Listagem 3. Implementando regras de apresentao
01 using System;
02 using System.Drawing;
03
04 namespace mvp.presenter
05 {
06 public class clsLoginPresenter
07 {
08 private ILoginPresenter objLoginPresenter;
09 public Color backgroundColor;
10 public String backgroundText;
11
12 public void add(ILoginPresenter loginPresenter)
13 {
14 objLoginPresenter = loginPresenter;
15 }
16 public void executeLogin(bool loginValid)
17 {
18 backgroundColor = loginValid ? Color.LightBlue : Color.LightYellow;
19 backgroundText = loginValid ? Access granted. : Access denied;
20 }
21 }
22 }
23

Conectando com a View em uma interface Web


A aplicao Web est baseada em Webforms com ASP.NET. O
cdigo necessrio para executar a operao pode ser conferido na
Listagem 4. Esta, demonstra o cdigo C# vinculado com a pgina

Edio 93 .NET Magazine

63

Design Patterns com .NET - Parte 1

ASPX chamada LOGIN.ASPX. Note primeiramente que no h


manipulao de regras de dados, apenas o envio destes para a
classe da camada Model fazer o seu trabalho. O cdigo restante
tem o objetivo de alterar a interface grfica de acordo com o que
foi definido na camada Presenter.
Listagem 4. Conectando a interface web
01 using System;
02 using mvp.presenter;
03
04 namespace mvp.view.web
05 {
06 public partial class Login : System.Web.UI.Page, ILoginPresenter
07 {
08 clsLoginPresenter objLoginPresenter = new clsLoginPresenter();
09
10 protected void Page_Load(object sender, EventArgs e)
11 {
12 objLoginPresenter.add(this);
13 }
14
15 protected void btnSend_Click(object sender, EventArgs e)
16 {
17 validateLogin(mvp.model.Login.DoLogin(txtUserId.Text, txtPassWord.Text));
18 }
19 public void validateLogin(bool doLogin)
20 {
21 objLoginPresenter.executeLogin(doLogin);
22 pnResult.BackColor = objLoginPresenter.backgroundColor;
23 lblResult.Text = objLoginPresenter.backgroundText;
24 }
25 }
26 }

Iniciando o cdigo, observe logo na linha 2 uma referncia ao


projeto mvp.presenter, para que as suas classes e interfaces possam
ser usadas diretamente no cdigo.
A pgina precisa implementar a interface ILoginPresenter para
poder ser enviada para a classe clsLoginPresenter. Note na linha 6
que isto est sendo feito logo aps a herana de System.Web.
UI.Page que o ancestral usado para construir pginas ASPX.
Neste ponto no deve haver problemas em compreender a forma
como a herana trabalhada no C# e no Framework .NET.
O passo seguinte definir um objeto do tipo clsLoginPresenter
(da camada Presenter). Este inicializado e vinculado com a pgina atual a cada evento Page_Load (linha 12). Como no estamos
mantendo o estado da pgina, preciso fazer isto sem considerar
o estado PostBack da mesma, em projetos profissionais considere
este aspecto.
Na linha 15 foi definido o event handler que responde ao click
do boto send. Este click faz duas chamadas em cadeia. Primeiramente chama o mtodo validateLogin definido na interface
da qual a pgina baseada. Como este mtodo recebe um valor
boolean indicando se o login foi bem sucedido j enviado o
resultado deste fazendo uma chamada ao mtodo DoLogin() da
classe mvp.model.Login .Como o mesmo um mtodo static,
no precisa de uma instncia. Mais uma vez, preciso prestar
ateno neste aspecto.
A implementao do mtodo validateLogin encontrada na
linha 19. Este o elemento do cdigo que vai invocar o mtodo

64 .NET Magazine Edio 93

executeLogin() passando o status do login que foi obtido para que


o Presenter possa aplicar a regra adequada e compor a apresentao que ser usada pela View.
Em seguida o painel que foi usado para conter o controle onde a
mensagem ser exibida tem sua cor de fundo alterada e tambm
o texto configurado.
Considere a simplicidade do cdigo que foi usado nesta pgina
e imagine como seria feita a sua implementao sem a presena
da camada Presenter.

Conectando com a View em Windows Forms


Chegou vez de verificar se o cdigo realmente aproveitvel em
outros tipos de interface grfica. A aplicao Windows forms possui
um formulrio denominado Login. O seu cdigo que aparece na
Listagem 5, pouco difere daquele que foi usado na aplicao Web.
Inicialmente considere a linha 7. Nesta, novamente o formulrio
Windows est herdando a interface ILoginPresenter da camada
Presenter para que possa interagir com esta.
Na linha seguinte criada uma instncia para clsLoginPresenter
da mesma forma que foi feito na aplicao Web. Este objeto a
ligao com a camada View e a Presenter.
Na linha 15 feita a implementao do mtodo definido na interface ILoginPresenter. Como no projeto Windows os controles so
diferentes, aps fazer a validao do login na linha 17, o controle
usado para apresentar a mensagem de validao neste caso um
TextBox configurado.
O mtodo da linha 22 disparado na carga do formulrio e cria
uma ligao deste com o objeto do Presenter (objLoginPresenter).
Como sabemos, o mtodo Load disparado durante a carga do
formulrio na memria e executado uma s vez.
Por fim, na linha 27 ficou definido o event handler que responde
ao click do boto send. Note que o cdigo basicamente o mesmo
que foi usado no formulrio Web.
Executando os dois tipos de projeto devem ficar claros quais so
suas vantagens. Os dois cdigos desconhecem o comportamento
do objeto de login. A sua apresentao toda definida pela camada Presenter, sendo que tanto formulrio Web como Windows
apenas tratam de aplicar adequadamente o que foi definido para
os seus elementos.

Consideraes para usar MVP


Antes de sair convertendo seus projetos e refatorando tudo o
que aparecer pela frente, alguns aspectos precisam ficar mais
claros.
importante frisar que designs patterns aumentam o trabalho.
Pense no fato que para dar um simples exemplo foram usados
quatro projetos. Considere o nmero de classes usadas, os conceitos envolvidos como interface, interface grfica, referncia de
projetos e herana. Este projeto leva aproximadamente uma hora
para ser elaborado, entendido e concludo. bem simples. Assim,
pense em projetos mais completos.
Quais os casos ento que se deve utilizar este design pattern e
mais, em qual cenrio isto seria vantajoso?

Listagem 5. Conectando a interface Windows


01using System;
02using System.Windows.Forms;
03using mvp.presenter;
04
05namespace mvp.view.windows
06{
07 public partial class Login : Form, ILoginPresenter
08 {
09 private clsLoginPresenter objLoginPresenter = new clsLoginPresenter();
10 public Login()
11 {
12 InitializeComponent();
13 }
14
15 public void validateLogin(bool doLogin)
16 {
17 objLoginPresenter.executeLogin(doLogin);
18 txtResult.BackColor = objLoginPresenter.backgroundColor;
19 txtResult.Text = objLoginPresenter.backgroundText;
20 }
21
22 private void Login_Load(object sender, EventArgs e)
23 {
24 objLoginPresenter.add(this);
25 }
26
27 private void btnSend_Click(object sender, EventArgs e)
28 {
29 validateLogin(mvp.model.Login.DoLogin(txtUser.Text, txtPassword.Text));
30 }
31 }
32}
33

Concluso
Est montado o cenrio onde as prximas aplicaes precisaram
ser desenvolvidas. Teremos cada vez mais plataformas, cada vez
mais dispositivos, cada vez mais necessidade de integrar tudo isso
e certamente menos tempo para fazer isto, ento, os patterns que
puderem servir como alavanca para acelerar a entrega e facilitar
esta integrao so bem vindos e necessrios.
O MVP talvez soe muito dcada de 2000. Para os programadores mais atualizados, ele provavelmente coisa do passado j
que MVC e MVVM so muito bem adaptados aos dois principais
cenrios de desenvolvimento da atualidade: aplicaes in browser e Windows client. Entretanto, h muito que se aprender com
o MVP, principalmente pelos programadores que herdaram um
padro de desenvolvimento baseado em cenrios mais antigos.
Neste exemplo foram omitidas outras possibilidades como
aplicaes WPF.
Vladimir Rech
vladimirrech@yahoo.com.br
http://vladimirrech.blogspot.com
http://twitter.com/vladimirrech
Tecnlogo em Desenvolvimento de Sistemas pelo CEFET/UTF-PR, trabalha com desenvolvimento de sistemas em .NET destacando-se aplicaes
Windows, ASP.Net e Webservices. Mantm um blog onde escreve sobre diversos assuntos
relacionados programao e ao Framework .NET.

WPF/HOME
http://windowsclient.net/wpf/

Se aplicar Design Pattern sem passar por fases como conversa


com os fornecedores de requisitos, anlise destes, concepo e
elaborao do projeto no h vantagem em se utilizar. Principalmente nas fases iniciais que se identificaro elementos que
justificaro a adoo ou no de um design pattern. Eu quero citar
algumas justificativas em que o projeto forte candidato a usar
MVP ou outro pattern:
1. O projeto possui uma probabilidade razovel de ser portado
para outras plataformas ou dispositivos.
2. A aplicao vai ser desenvolvida usando o TDD Test Driven
Development onde testes automatizados faro parte essencial
do desenvolvimento.
3. Projetos pilotos para que a equipes de desenvolvimentos
ou programadores individuais, entre em contato com novas
tecnologias.
4. Migrao de aplicaes legadas. Uma aplicao rodando h
muito tempo precisa ser atualizada.

Use Visual Inheritance to Create Consistent Windows Forms in


VB.NET and C#
http://devcity.net/Articles/35/visual_inherit.aspx

O tempo o fator mais importante a ser levado em conta. Cada


profissional tem uma curva de aprendizado particular. Programadores que esto habituados com modelos antigos de desenvolvimento tero mais dificuldades em adaptar-se.
Se no projeto, o tempo de entrega for um fator crtico, melhor
deixar para outra oportunidade ou, manter um time em paralelo
se houver disponibilidade.

D seu feedback sobre esta edio!

Windows Forms Videos


http://windowsclient.net/learn/videos.aspx
Model View Presenter
http://msdn.microsoft.com/en-us/magazine/cc188690.aspx
Model View Presenter (MVP)
http://migre.me/5WCNO (http://www.c-sharpcorner.com/UploadFile/shivprasad
k/1246712242008074334AM/12467.aspx)
Using Model View Presenter in WPF
http://www.paulstovell.com/wpf-model-view-presenter

edio
ta

D seu voto sobre este artigo, atravs do link:

Feedback
eu
sobre e
s

A Java Magazine tem que ser feita ao


seu gosto. Para isso, precisamos saber
o que voc, leitor, acha da revista!

D
s

MVP-VM (Model View Presenter - ViewModel)


http://www.codeproject.com/KB/architecture/MVPVMWindowsForms.aspx

www.devmedia.com.br/javamagazine/feedback

Edio 93 .NET Magazine

65

Seo Engenharia de Software: Nesta seo voc encontra artigos relacionados a anlise, modelagem,

Visual Studio 2010 para

Escrevendo cdigo mais simples e resumido


Resumo DevMan
De que se trata o artigo:
O artigo trata das novas funcionalidades presentes na verso 2010 do Visual Studio para as atividades relacionadas arquitetura e tambm ao desenvolvimento de softwares. Entenderemos os pilares
desses recursos na viso do arquiteto de software e tambm do desenvolvedor. Um exemplo destes
recursos quando necessitamos entender um cdigo antigo ou at mesmo quando o conhecemos
pela primeira vez.

Em que situao o tema til:


Esse tema de grande utilidade durante toda a fase do design da arquitetura de um software, bem como
o acompanhamento e validao da estrutura proposta pelo arquiteto de software. Alm disso, durante
o desenvolvimento de um software, veremos como garantir que os desenvolvedores esto realmente
seguindo a estrutura inicial proposta pelo arquiteto de software.

Visual Studio 2010 para arquitetos de software:


Com o crescente avano dos recursos de hardware e software, tivemos tambm como consequncia o
aumento da complexidade dos softwares produzidos. Entender e desenhar a estrutura de um software
empregando boas prticas, com um baixo acoplamento, permitir o mximo de reutilizao da estrutura,
aderncia ao domnio do negcio, exige um esforo considervel por parte da equipe de desenvolvimento.
As features presentes na verso 2010 do Visual Studio vieram para tornar esse trabalho menos dispendioso.
Veremos como podemos criar arquiteturas de camadas e garantir que nenhum desenvolvedor quebre
essa estrutura. Outro ponto interessante como o Visual Studio pode auxiliar algum que novo na
equipe ou algum que precisa alterar algum cdigo que no modificadoa muito tempo e no lembra
como foi feito para entender sua estrutura de classes, namespaces, membros etc. Alm disso, veremos
como gerar uma userstory a partir de um caso de uso e tambm como podemos gerar cdigos a partir
do nosso diagrama de classes.

uando falamos em arquitetos de


software estamos nos referindo a
um profissional cujas habilidades
necessrias devem compreender um bom
raciocnio estratgico a nvel de componentes, reutilizao e a nvel de estrutura
do software. Deve tambm ter um domnio
organizacional de qualidade.
Uma arquitetura concebida com base
em um conjunto de decises que esto
fundamentadas em um determinado tipo
de negcio e uma determinada tecnologia.
Nesse contexto, podemos considerar tambm a estrutura e a natureza da organizao que ir montar essa arquitetura. Ainda

66 .NET Magazine Edio 93

nesse cenrio, no podemos esquecer que


existem vrias pessoas envolvidas em um
determinado projeto e que compe um
time, assim sendo, a arquitetura desenhada est sob a tica de vrias pessoas
envolvidas no projeto como analistas de
negcios, desenvolvedores, o prprio arquiteto de software.
O desenvolvimento de uma arquitetura
deve sem dvida fazer parte do cronograma do projeto, alm do oramento.Isso se
justifica por um simples motivo, porque
o padro de arquitetura que foi criado
deve conduzir o projeto dentro daquilo
que foi estabelecido no incio dodesign da

projeto, testes, entre outros temas relacionados a ES

arquitetos de software
Fernando Ferreira
arquitetura. Contudo, se aps a elaborao do padro de arquitetura, e todos os acordos definidos no projeto, o time comear a
se desviar daquilo que foi anteriormente proposto, temos ento
um desperdcio de tempo e tambm dedinheiro do cliente sendo
jogado fora.
A partir de agora temos uma ferramenta muito boa para dar
apoio as prticas de arquitetura de um software. Com as novas
features de arquitetura presentes no Visual Studio 2010 ficar
mais fcil um desenvolvimento, acompanhamento e a evoluo
de toda a parte de arquitetura de software, no apenas por parte
do arquiteto, mas tambm dos desenvolvedores. O alinhamento
entre o definido e o executado est mais fcil de acompanhar
e controlar mesmo quando o desenvolvedor resolver enviar o
cdigo fonte ao servidor de fontes sem uma validao prvia de
arquitetura, o servidor de builds garantir que as regras esto
sendo cumpridas e a sua arquitetura ser preservada.
Hoje tambm temos outra abordagem para o desenvolvimento
de uma arquitetura, essa abordagem chama-se arquitetura
evolucionria. Quando falamos em arquitetura evolucionria,
estamos falando do desenvolvimento de uma arquitetura que
recebe melhorias de acordo com a necessidade do momento, ou
seja, quando a criamosno pensamos em tudo o que pode vir a ser
necessrio para atender o contexto atual. A palavra chave nesse
cenrio a simplicidade.

Os recursos de arquitetura no Visual Studio 2010


Na verso 2010 do Visual Studio, um dos grandes investimentos
por parte da Microsoft foram os recursos de arquitetura na
ferramenta. Esses recursos esto disponveis apenas na edio
Ultimate. Essa edio traz nativamente os recursos de modelagem,
validao e explorao de cdigos, tudo isso forma o que iremos
chamar de Pilares de Arquitetura dentro do Visual Studio 2010.
Em sua edio Premium possvel visualizar esses diagramas em
UML, camadas e os grficos criados na linguagem DGML.
Contudo, pode ser que todos esses recursos no sejam suficientes
para determinada situao, nesse caso a ferramenta permite que
voc possa criar as suas prpriasextenses para visualizao,
validao, exportao etc.E incorporar na IDE do Visual Studio
2010 atravs do recurso de extensibilidade.

Os pilares de arquitetura no Visual Studio 2010


A edio Ultimate do Visual Studio 2010 tem suporte aos recursos
de arquitetura baseados em trs grandes pilares. O primeiro deles
est direcionado ao entendimento e compreenso de cdigos j

existentes. Umas das dificuldades que ocorre com frequncia


o entendimento de um cdigo fonte por algum que acabou de
chegar organizao, na maioria das vezes isso leva um certo
tempo para que a pessoa esteja familiarizada com o mesmo. Alm
disso, outro ponto a considerar que passado algum tempo, ns
mesmos no lembramos por completo de um cdigo que criamos
no passado e precisamos olhar novamente e lembrar como aquele fonte foi criado e qual seu propsito. Diante desse cenrio,
o Visual Studio 2010 Ultimate traz um recurso que permite ao
arquiteto ou desenvolvedor explorar o cdigo e a arquitetura
anteriormente concebida, esse recurso chama-se Architecture
Explorer. Esse ento o primeiro pilar arquitetural presente no
Visual Studio 2010 Ultimate. Ainda dentro dessa linha que visa a
explorao e o entendimento do fonte, temos tambm os grficos
de dependnciasque nos auxiliam de forma visual a entender
as ligaes e o nvel de acoplamento entre os diversos artefatos
produzidos.
Um padro de arquitetura muito conhecido e bastante utilizado
o padro de camadas. Esse padro permite uma melhor organizao da estrutura do software, separando o projeto em camadas
como interfaces de usurios, regras de negcio, e a camada de
acesso aos dados. Essas trs so bem conhecidas dos desenvolvedores (claro que pode haver outras). Porm, mesmo havendo o
acordo de que essa ser a estrutura de arquitetura adotada para
um determinado projeto, nada impede que ela seja quebrada, ou
seja, que algum desenvolvedor faa um acesso direto da interface
do usurio a camada de acesso aos dados sem passar pela camada
de regras de negcios. Para conceber uma arquitetura em camadas
e garantir sua integridade durante todo ciclo de vida do projeto,
temos uma ferramenta chamada LayerDiagram Diagrama de
Camadas. Esse caracteriza o segundo pilar dos recursos de arquitetura presentes no Visual Studio 2010.
No menos importante em um projeto, a comunicao que a
equipe precisa manter. A forma como isso pode ser feito tem suporte nativo no Visual Studio 2010 atravs dos diagramas de UML.
Hoje a ferramenta conta com cinco diagramas UML 2.1. So eles:
diagrama de classes, sequncia, casos de uso e o de componentes.
A melhoria no processo de comunicao se concentra no ponto
onde temos o suporte ao conceito de work item.
Workitem(toda ao de um projeto) compreende UserStory, Tasks,
Bugs. Como j deve ter notado so conceitos utilizados no mundo
gil de desenvolvimento de softwares. Logo ficou muito fcil passar
uma atividades para algum desenvolvedor ou para o time atravs
de um diagrama de casos de uso, por exemplo, onde podemos

Edio 93 .NET Magazine

67

Visual Studio 2010 para arquitetos de software

transformar um caso de uso em um work


item de qualquer tipo. Ento temos o nosso
terceiro pilar de arquitetura no Visual Studio 2010, os diagramas da UML.

Compatibilidade com verses anteriores


do .NET
J vimos que todas essas novas funcionalidades de arquitetura fazem parte da
edio Ultimate do Visual Studio 2010,
porm, sabemos que existe muito cdigo
fonte desenvolvido em outras verses da
ferramenta e inclusive verses diferentes
de .NET Framework para outro. Muitas
empresas ainda no portaram seu cdigo
ou esto ainda fazendo essa portabilidade
para a verso mais atual da ferramenta
e do prprio framework. Mas ento a
pergunta , conseguirei ter todas essa
funcionalidades em um cdigo escrito por
outra verso da ferramenta? A resposta
sim, porm existe uma restrio quanto a
verso do .NET Framework. preciso que
seu cdigo tenha sido escrito na verso 2.0
ou superior, para que voc possa usufruir
dos novos recursos.

O Architecture Explorer e os grficos de


dependncia
Entender o cdigo e a arquitetura em
que se est trabalhando parte fundamental para a realizao de um trabalho
de forma eficiente e menos propensa a
falhas. Quando se tem um cdigo relativamente pequeno essa tarefa torna-se

mais fcil. Mas para ser ter um cdigo


pequeno e limpo, a organizao deve
utilizar boas prticas de desenvolvimento
as quais fogem do escopo desse artigo.
Contudo em nosso cotidiano, nos deparamos frequentemente com volumes muito
grande de cdigos fonte e ler todo esse
fonte para entender seu propsito muitas
vezes torna-se uma tarefa cansativa e tediosa. Esse esforo pode ser reduzido com
o auxlio do Architecture Explorer e a gerao dos grficos de dependncia. A ideia
dos grficos de dependncia facilitar a
visualizao e a compreenso do sistema
como um todo e o grau de acoplamento
entre as estrutura. A dependncia entre
as classes, por exemplo, representada
atravs de setas informando o sentido
da dependncia. Ao gerar um grfico de
dependncias de uma aplicao podemos
ver que as setas no so todas da mesma
espessura, existem setas mais finas e
outras mais largas. Isso no por acaso,
no momento da gerao desse grfico,
o Visual Studio analisa o quo forte a
dependncia entre as classes no momento
e atribui uma espessura para cada nvel
de fora nesse relacionamento. A partir
desses dados, alm da compreenso, fica
fcil identificar pontos que podem ter
dependncias reduzidas, ou seja, uma
melhoria no cdigo torna-se mais fcil. No
canto superior direito, existe um nmero,
esse nmero representa a quantidade de
artefatos presentes dentro de cada n.

Esses artefatos podem ser namespaces,


classes ou mtodos. Na Figura 1 voc
confere um exemplo de dependncias de
uma estrutura.
Dependendo do porte do sistema, tornase mais difcil identificar certos elementos,
por exemplo, identificar aqueles que tm
a visibilidade pblica ou ento podemos
querer separar elementos por categorias.
Um exemplo quando gostaramos de
visualizar apenas as classes j que podemos ter em um nico diagrama, elementos
como namespaces, arquivos etc. Claro que
temos a opo de gerar grficos separados
por Classes, Namespaces ou Assembly,
mas se geramos de um sistema inteiro,
outros ele mentos tambm apareceriam no
grfico, neste caso existe a opo de uma
consulta avanada no mesmo. Para realizar
essa consulta, basta clicar com o boto
direito em qualquer rea do grfico e selecionar a opo Show AdvancedSelection
e uma tela ser exibida no canto direito do
seu diagrama. Na Figura 2 podemos ver
um exemplo dessa tela.

Figura 2. Opes avanadas de identificao de elementos


em um grfico de dependncias

Figura 1. Diagrama de dependncias

68 .NET Magazine Edio 93

uando solicitamos a gerao de um grQ


fico de dependncias de um sistema inteiro, podemos ter dois inconvenientes (caso
o sistema seja muito grande). O primeiro
deles o fato de precisar trabalhar com o
zoom, alm disso pode haver problemas
com limitao de memria e o seu grfico
no seja gerado. Esse tipo de situao no
comum de acontecer, at porque ningum
ir explorar um sistema inteiro de uma
nica vez a fim deentend-lo.
Atravs do Architecture Explorer possvel selecionar apenas os elementos que

voc precisa verificar sem precisar gerar


um grfico relativamente grande e ficar se
localizando nele. Na Figura 3 temos a tela
do Architecture Explorer.

Conhecendo o Architecture Explorer


No lado direito da tela, podemos ver
alguns botes para interao. O primeiro
deles permite criar um novo diagrama
mostrando a interao entre os objetos
selecionados. Nesse cenrio podemos
imaginar que estamos navegando em
uma determinada estrutura de classes
ou outros itens do projeto e desejamos
ver qual o grau de interao entre esses
objetos e quais membros tambm esto
envolvidos nesse contexto. O segundo
permite que sejam adicionados novos itens
aos j existentes(no diagrama atual). Nesse
caso, outra seleo foi feita e desejamos que
essa tambm seja inserida no grfico. A exportao desse grfico pode ser realizada
atravs do terceiro boto, onde podemos
nomear esse diagrama e salvar em algum
local. O quarto boto serve para eliminar
uma consulta efetuada, limpando todas as
colunas e permitindo que se comece uma
nova consulta. O ltimo boto permite
que se armazene uma consulta feita no
Architecture Explorer ou ento criando
consultas predefinidas para serem usadas
futuramente.
Nota
A edio Premuim do Visual Studio 2010 permite a
visualizao de grficos que utilizam a linguagem DGML DirectedGraphMarkupLanguage.
O mesmo uma linguagem grfica de marcao baseada em
XML para a criao de grficos e anlise. Pode ser usada para
representar estruturas, como grfico de dependncias, rvores,
anlise de complexidade.

Na primeira coluna do Architecture


Explorer Figura 3, podemos ver trs grupos distintos. O primeiro grupo que tem
o Ttulo Visual Studio seguido do nome
do projeto contm dois itens o Class View
e o Solution View. O Class view como o
prprio nome sugere, permite navegar
em toda a estrutura de classes do projeto.
A navegao se d a partir do namespace,
seguindo para as classes, os menbros das

Figura 3. Viso inicial da estrutura de um projeto pelo Architecture Explorer

Nota do DevMan
Existem algumas funcionalidades de arquitetura no Visual Studio 2010 que s so possveis, atravs de extenses chamadas Power Tools
e Feature Pack. Podemos citar algumas delas, por exemplo,Architecture Explorer para navegar em cdigos C e C++, gerar cdigo atravs
do diagrama de classes entre outras. Essas so funcionalidades que s esto disponveis atravs da instalao de uma Feature Pack de
Modelagem e Visualizao.
Porm, existem tambm as conhecidas Power Tools que adicionam funcionalidades a IDE do Visual Studio. Mas se ambas adicionam
funcionalidades atravs de extenses qual a diferena?
A diferena que uma Power Tool feita pra atender alguma solicitao do mercado ou da comunidade referente a uma funcionalidade
que no est presente no Visual Studio. As Power Tools so gratuitas e desenvolvidas rapidamente para atender a uma necessidade. No h
suporte por parte da Microsoft para as power tools.
J as Feature Packs tambm so extenses de funcionalidades, porm essas sero incorporadas nas prximas verses do produto. So
extenses com o mximo de qualidade e a Microsoft oferece suporte para as Feature Packs. Para baixar uma Feature Pack necessrio ter
uma assinatura MSDN.

classes, os mtodos etc. Tudo o que for


preciso verificar sobre uma determinada
classe, estar no Class view.
Posteriormente temos o Solution View,
esse por sua vez permite uma navegabilidade e localizao fcil de qualquer
arquivo contido na soluo, desde arquivos de cdigo fonte at arquivos de texto,
imagem, arquivos .aspx etc. Na coluna ao
lado exibido todos os projetos da soluo,
em seguida todos os arquivos contidos no
projeto e assim at que o elemento procurado seja localizado.
O prximo grupo o File System, nesse
grupo existe uma opo chamada Selected
Files que abre uma caixa para que possa
ser selecionado um determinado arquivo
que desejamos localizar. Por ltimo, temos
o grupo Saved DGQL Queries, esse grupo
responsvel por gerenciar as consultas
que so realizadas no Architecture Explorer. Ele possui dois itens, o primeiro chamado In Foldersque o responsvel por
armazenar algumas consultas predefinidas, alm de consultas criadas pelo prprio
usurio. Essas consultas so armazenadas
em uma pastas definida pelo Visual Studio, no seguinte caminho: ...Documents\

Visual Studio 2010\ArchitectureExplorer\


Queries. Por ltimo, temos as consultas
adicionadas a prpria soluo e que podem ser recuperadas atravs da opo In
My Solution, essa opo contm todas as
consultas DGQL que foram adicionadas
anteriormente na soluo.

Arquitetura definida. E agora?


Sabemos que um ponto chave em um
projeto profissional de software a definio da arquitetura. Esta definio depende
de vrios fatores como domnio da aplicao, natureza e estrutura organizacional
de uma empresa, ambiente externo. Esse
so alguns pontos que costumam influenciar na hora de decidir pela utilizao
desse ou daquele padro de arquitetura.
Logo, a arquitetura o resultado de um
conjunto de decises referentes a negcios
e a tecnologia.
Os desafios de utilizao de uma arquitetura no terminam com a escolha, na verdade eles apenas comearam. A partir do
momento em que iniciou a implementao
do projeto, passa a existir uma necessidade
de garantir que a arquitetura definida
anteriormente esteja sendo seguida.

Edio 93 .NET Magazine

69

Visual Studio 2010 para arquitetos de software

Em um time de desenvolvimento, diversos so os fatores que


podem levar um desenvolvedor a no seguir o padro arquitetural estabelecido.Se isso vier a ocorrer, ento temos um problema
grande que precisa ser eliminado.

O Diagrama de camadas
O Visual Studio 2010 Ultimate trouxe uma nova funcionalidadereferente a modelagem e garantia da integridade arquitetural e
que podemos entender como sendo o segundo pilar de arquiterura
presente na ferramenta.Estamos falando dos diagramas de camadas. Com essa nova feature podemos modelar a arquitetura da
nossa aplicao na prpria IDE do Visual Studio 2010 Ultimate e
a partir dessa modelagem, podemos definir regras de integridade
que devero ser seguidas pelo time de desenvolvimento.
Modelar um diagrama de camadas auxilia no processo de comunicar a equipe qual o padro de arquitetura que se pretende implantar.
Cada camada ter uma responsabilidade especfica dentro de um
determinado contexto. possvel que uma camada possa conter
outras subcamadas com responsabilidades menores que iro formar
a totalidade de uma determinada camada. Um diagrama de camadas
uma grande ferramenta que nos auxiliar em atividades como: tornarevidentes possveis impactos causados por alteraes pretendidas,
manter uma estrutura de elementos e, coesa no cdigo, evitando uma
possvel quebra de dependncia na estrutura do projeto.

Criando um diagrama de camadas

Na Figura 5 temos um diagrama de camadas que utilizaremos


como modelo. Esse diagrama possui trs camadas, cada um com
a sua devida responsabilidade. Temos uma camada destinada
exibio dos dados ao usurio.Essa camada possui duas subcamadas que sero destinadas a aplicaes Web e Desktop respectivamente. Em seguida temos uma camada intermediria destinada
lgica de negcios, essa camada tem como responsabilidade
gerar subsdio de informao para a camada superior com base no
domnio de conhecimento do negcio a ser modelado. A camada
de negcios tambm possui duas subcamadas, uma destinada
a prover servios como um web service, por exemplo. J que a
aplicao tambm ser usada na web e a outra destinada s regras
de negcio. A ideia por trs desse modelo que a camada inferior
sempre ir prover informao camada superior. Nesse cenrio,
devemos impedir duas coisas: A camada inferior no poder ter
qualquer dependncia em relao camada superior, pois nesse
caso, no faria sentido modelar em camadas e teramos um sistema
engessado e qualquer acesso aos dados deve obrigatoriamente
passar pela camada intermediria, ou seja, jamais um desenvolvedor poder acessar a camada de dados diretamente da camada
de interface grfica.
Precisamos definir as dependncias entre as camadas. Para o nosso
contexto essas dependncias sero unidirecionais, da camada superior para a acamada inferior. Note que a seta que representa a dependncia, est em um nico sentido. Existem tambm as dependncias
Bidirecionais, onde a dependncias se d nos dois sentidos.

No Visual Studio 2010 Ultimate, a criao de um diagrama de


camadas implica na adio de um projeto de modelagem. Aps a
adio desse projeto na soluo, teremos as ferramentas necessrias no ToolBox, para que seja possvel criar o modelo de arquitetura pretendida. Na Figura 4 temos a caixa de adio de um novo
projeto de modelagem, essa se encontra no menuArchitecture ->
New Diagram ou Add New Project.

Figura 5. Modelo de um diagrama em trs camadas

Criando a dependncia entre as camadas

Figura 4. Criao de um novo projeto de modelagem chamado Arquitetura

70 .NET Magazine Edio 93

Com o diagrama j criado, agora hora de estabelecer as dependncias e efetuar as validaes. Para isso, precisamos adicionar
mais quatro projetos a nossa soluo. Dois desses projetos sero
do tipo Class Library, onde cada um far o acesso a sua camada
especfica. O primeiro projeto daremos o nome de Exemplo.BLL

que ser o projeto responsvel pelas regras de negcio, j o segundo chamaremos de Exemplo.DAL, que far o acesso a base de
dados. O Terceiro projeto ser do tipo WCF que representar um
servio e o ltimo um projeto Windows Forms, para a interface
de usurio desktop.
Aps a criao desses projetos, a estrutura da soluo dever ficar
conforme a Figura 6.

Nota do DevMan
comum ver nas diversas literaturas de T.I o termo camadas. Em nosso idioma portugus brasileiro
existe apenas uma expresso para isso que representada pelo substantivo camada. No idioma ingls
existem duas expresses para a palavra camada, temos layer e tier. Existe uma diferena sutil nesse
caso, quando nos referimos a camadas lgicas utilizamos layer e quando nos referimos a camadas
fsicas utilizamos a palavra tier.

um outro mtodo esttico chamado meuMetodoBLL, esse mtodo


faz uma chamada ao mtodo da classe ClasseDAL. A ideia desses
mtodos apenas para poder fazer chamadas de outras classes.
Na Listagem 1 e Listagem 2 podemos ver esses mtodos.
Podemos ver que o mtodo meuMetodoBLL faz uma chamada
ao metodo meuMetodoDAL, ou seja, a regra de negcios est
solicitando alguma informao da camada de dados e nesse caso
estamos seguindo o padro. S que nenhuma camada est chamando o mtodo meuMetodoBLL, as camadas que podem fazer
esse tipo de acesso so apenas as camadas de interface grfica, no
nosso caso as subcamadas UI Web e UI Windows Forms. Vamos
pegar para o nosso cenrio a subcamada Web e fazer uma chamada ao metodo da camada de regra de negcios.
Nota
Para esse exemplo, qualquer camada da interface grfica poderia fazer chamada camada de regra
de negcios, optou-se pela camada Web, mas a camada Windows Forms tambm teria o mesmo
resultado na validao. Fique a vontade para fazer uma chamada pela subcamada WindowForms. A
camada de servios apenas completa o modelo, nenhum cdigo ser atribudo a ela.

No evento page_load da pgina Default.aspx faremos uma


chamada ao mtodo da regra de negcios. O cdigo mostrado
na Listagem 3.

Figura 6. Estrutura da soluo em camadas


om os projetos j criados, hora de ligar cada projeto com
C
a nossa arquitetura definida, a partir de agora que toda essa
estrutura poder ser validada de verdade. Faremos isso apenas
arrastando o projeto chamado ExemploWeb.UI para a subcamada de apresentao UI Web, o projeto ExemploWinForms.
UI para a subcamada UI Windows Forms, o projeto Exemplo.
SVC para a subcamada Servios, o projeto Exemplo.BLL para
a subcamada de Regra de Negcios e, o projeto Exemplo.DAL
para a ltima camada, neste caso a camada de acesso aos dados.
Perceba que ao arrastar um projeto para a respectiva camada,
aparece no canto superior direito um nmero que nesse caso o
nmero um. Isso significa que a nossa camada de apresentao
agora est ligada com um assemblye o projeto correspondente
a cada camada. Vamos renomear algumas classes para evitar de
confund-las futuramente. As classes dos projetos Exemplo.BLL
e Exemplo.DAL foram renomeadas para ClasseBll e ClasseDAL
respectivamente.
Precisamos adicionar referncias aos nossos projetos.Faremos da
seguinte forma, nos projetos Web, Windows Forms e Exemplo.
SVC, adicionaremos uma referncia ao projeto Exemplo.BLL, ou
seja, essas trs camadas precisam passar pela camada de regra de
negcios. No projeto Exemplo.BLL, adicionaremos uma referncia
ao projeto Exemplo.DAL.
Aps renomear essas classes, criaremos um mtodo em cada
uma delas e na classe ClasseDAL criaremos um mtodo esttico
chamado meuMetodoDAL.Por fim, na classe ClasseBll criaremos

Listagem 1. Mtodo da classe BLL chamando o mtodo da classe DAL


public class ClasseBll
{
public static void meuMetodoBLL()
{
ClasseDAL.meuMetodoDAL();
}
}

Listagem 2. Mtodo da classe DAL


public class ClasseDAL
{
public static void meuMetodoDAL()
{
}
}
Listagem 3. Chamada da interface grfica a camada de regra de negcios.
protected void Page_Load (object sender, EventArgs e)
{
ClasseBll.meuMetodoBLL();
}

Agora que temos a nossa arquitetura pronta e as devidas referncias


atribuidas, basta que validemos a nossa arquitetura para verificar se
est tudo correto. Para fazer isso, basta clicar com o boto direito em
qualquer rea do grfico e selecionar a opo Validade Architecture.
Nesse momento o Visual Studio comear uma validao em toda a
arquitetura a fim de encontrar alguma falha. Nesse caso, tudo est
correto e nenhuma falha foi localizada conforma a Figura 7.

Edio 93 .NET Magazine

71

Visual Studio 2010 para arquitetos de software

Com a arquitetura validada, vamos


simular uma ao que ir tentar quebrar
as regras definidas. No projeto Exemplo
WinForms.UI, adicionaremos uma referncia direta a nossa camada de acesso
a dados. Sabemos que essa operao est
violando a nossa arquitetura e sendo
assim, essa operao no dever ser permitida. Aps adicionar a referncia ao
projeto Exemplo.DAL iremos realizar uma
chamada no evento load do formulrio,
conforme Listagem 4. A estrutura de referncia do projeto Windows Forms dever
ficar semelhante a Figura 8.

Listagem 4. Chamada invlida a um mtodo da


camada acesso a dados.
private void Form1_Load(object sender, EventArgs e)
{
ClasseDAL.meuMetodoDAL();
}

Feitas as alteraes, j podemos revalidar a nossa arquitetura e ver se h algo


de errado nessa implementao. Aps a
validao dessa arquitetura, podemos ver
na Figura 9 que o Visual Studio retornou
um erro informando o mtodo e o respectivo evento que fez a chamada invlida
bem como a sua referncia.

UML no Visual Studio 2010 Ultimate


A Linguagem de Modelagem Unificada
UML uma linguagem amplamente
usada no desenvolvimento de softwares, desde a especificao, comunicao,
definio da ordem sequencial de aes
etc. Atravs da combinao de diagramas
estticos e dinmicos possvel modelar todo um software, do incio ao fim.
A partir da verso 2010, o Visual Studio
Ultimate passou a incorporar alguns
dos principais diagramas da UML.
Na prpria IDE do Visual Studio possvel criar os seguintes diagramas:

Figura 7. Resultado da validao da arquitetura definida

Diagrama de Classes
D
iagrama de Sequncia
Diagrama de Caso de Uso
Diagrama de Atividades
Diagrama de Componentes

Nota do DevMan
Uma das novidades doVisual Studio Team Foundation Server
2010 uma poltica de check-in no servidor de build. Esse
recurso chamado Gated Check-in impede que um cdigo
que no compila ou no esteja de acordo com a arquitetura
definida seja inserido na build principal. Isso impede que uma
build seja "quebrada".
Antes que o cdigo seja inserido na build principal, um
conjunto de regras de validao e compilao acionado
automaticamente, todo o cdigo submetido a essa poltica de
validao. Se o cdigo passar nessa validao, ento o checkin
aceito, caso contrrio, ele recusado. Portanto, mesmo se o
desenvolvedoresquecer de validar a sua arquitetura, o servidor
de build se encarregar de validar e compilar o cdigo.

O Visual Studio 2010 possui total integrao com uma plataforma de ALM chamada
Visual Studio Team Foundation Server
2010. Essa integrao se d atravs do Team
Explorer que uma janela que permite a
conexo e a navegao nos artefatos de um
determinado projeto. O Team Foundation
Server trabalha como conceito de work item
que pode ser uma tarefa, correo de um
bug, uma estria de usurio, enfim, alguma
atividade a ser executada. Agora na verso
2010 do Visual Studio, alm de poder modelar um cenrio atravs de um diagrama
de caso de uso, tambm possvel gerar
um work item no Team Foundation Server
2010. Isso torna mais fcil a divulgao de
um requisito, por exemplo.

Integrao com o Team Foundation


Server 2010
Figura 8. Estrutura de referncias do projeto ExemploWinForms.UI

Figura 9. Erro de validao de arquitetura do informando o mtodo e a referncia invlida

72 .NET Magazine Edio 93

A s necessidades do cliente devemser


documentadas de alguma forma para que
seja possvel prioriz-las e estim-las. Uma
forma de modelar essas solicitaes do
cliente atravs de um diagrama de casos
de uso. Esse diagrama uma representao de mais alto nvel de um requisito. J
vimos que o Visual Studio Team Foundation Server 2010 utiliza o conceito de work
item e agora com a incluso dos recursos
de UML no Visual Studio 2010 Ultimate

totalmente possvel integrar um caso de uso a um work item no


Team Foundation Server.
A integrao entre os diagramas de UML no est restrita somente ao diagrama de casos de uso, todos os cinco diagramas
presentes no Visual Studio 2010 podero ser convertidos em work
item no ambiente do Team Foundation Server 2010. Se no houver
a necessidade de criar o mesmo, o elemento UML em questo poder ser vinculado a um work item j existente, mantendo assim
uma integrao entre o modelo e o work item, evitando modelos
soltos no projeto.
Figura 10. Diagrama inicial de caso de uso

Nota do DevMan
ApplicationLifecycle Management (ALM) um processo contnuo de gesto do ciclo de vida de
um aplicativo por meio de governana, desenvolvimento e manuteno. Para a engenharia de
software tornou-se possvel utilizar ferramentas que facilitem e integrem os requisitos de gesto,
arquitetura, codificao, testes, monitoramento e gerenciamento de liberao.

Criando um Work Item a partir de um caso de uso


Nas metodologias geis os requisitos dos usurios so conhecidos como estrias de usurios, onde so registrados em cartes,
so pontuados e quebrados em tarefas menores e ento sero
estimados. No comum ver casos de uso nesse cenrio, pois
estes demandam mais esforo a partir do momento em que precisamos estend-los, ou seja, elaborar um documento descrevendo
detalhadamente como dever ser o funcionamento do requisito,
definindo atores principais, interessados, fluxo principal e alternativo. Demanda um esforo considervel e, num ambiente gil, onde
as mudanas de requisito so aceitas e trabalhadas rapidamente,
demandar tal esforo, pode no ser uma boa ideia.
Para esse cenrio, a integrao dos casos de uso com um work
item foi muito bem vinda. Podemos modelar um caso de uso e
gerar a partir do mesmo uma userstory no Team Foundation
Server 2010. Comearemos adicionando ou criando um projeto de
modelagem no Visual Studio e selecionaremos a opo Use Case
Diagram. Montaremos um diagrama conforme a Figura 10.
Nesse cenrio temos trs casos de uso, Efetuar Login, Fazer Pedido
e EfetuarPagamento. Para o caso de uso Efetuar login j temos uma
UserStory para ele no Team Foundation Server, iremos fazer ento
uma vinculao entre esse Caso de uso e a UserStory.
Clicando como boto direito sobre o caso de uso Efetuar login,
selecionaremos a opo Link toWork Item. Em seguida ser
aberto uma janela para selecionarmos o projeto e a consulta que
trar a lista de work item no projeto selecionado. Podemos ver
a tela na Figura 11. Selecionamos o primeirowork item da lista,
onde representa a UserStory de Login no sistema. Note que essa
userstory possui duas tarefas j vinculadas.
Confirmando a criao do vnculo e voltado ao diagrama de
casos de uso, podemos notar que apareceu um cone ao lado da
elipse do caso de uso. Isso representa que h algum work item
vinculado. Podemos ver esse cone na Figura 12.

Figura 11. Tela de seleo do Work Item

Figura 12. Caso de uso vinculado a uma user story j existente


Para o caso de uso Fazer Pedido, iremos criar uma nova userstorydiretamente no Team Foundation Server, para que essa possa
mais tarde ser quebrada em tarefas e estimada em horas. Clicaremos com o boto direito sobre o caso de uso Fazer pedidos e
selecionaremos a opo CreateWork Item -> UserStory. Seremos
direcionados para uma tela que j vir com o ttulo do caso de uso
automaticamente na userstory conforme a Figura 13. Os demais
dados foram preenchidos depois.
Para o caso de uso Fazer Pedido, iremos atribuir a ele um diagrama de atividades que ser usado para informar ao desenvolvedor
como dever ser o processo de efetuar um pagamento. Nesse caso,
o diagrama de atividades um artefato para o caso de uso e ser
vinculado como uma dependncia. Vamos criar um diagrama de
atividades conforme o exemplo da Figura 14.

Edio 93 .NET Magazine

73

Visual Studio 2010 para arquitetos de software

Mais recursos na Feature Pack

Figura 13. Tela para gerar um novo Work Item no Team Foundation Server 2010

Vimos que existem extenses chamadas Feature Packs que


contm funcionalidades que no esto presentes no Visual Studio
2010 Ultimate. Essas funcionalidades tornam os recursos de UML
do Visual Studio 2010 ainda mais interessantes. Lembrando que
as feature packs so partes oficiais do produto que sero implementadas em verses futuras.
Vejamos algumas dessas funcionalidades da Feature Pack:
Gerao de cdigo das classes modeladas;
Gerao de grficos de dependncias para cdigos escritos em
C e C++;
Gerao e validao de diagrama de camadas para cdigos
escritos em C e C++;
Gerao de diagrama de classes a partir de cdigos j existentes;
G
erao de diagramas de sequncia a partir de cdigos;
Esses so alguns dos recursos na feature Pack.

Concluso

Nota
Um artefato pode ser entendido como um diagrama ou um documento vinculado ao diagrama atual.

Voltamos agora ao nosso diagrama de caso de uso e na Solution


Explorer podemos selecionar e arrastar o diagrama de atividades para
dentro do diagrama do mesmo. Poder posicion-lo em qualquer parte
de tela. Por ltimo, clicamos com o boto direito sobre o caso de uso
Efetuar Pagamento e selecionamos Add-> Dependency. Assim teremos um link do nosso caso de uso com um diagrama de atividades.
O resultado final deve ser um diagrama igual ao da Figura 15.

Fernando Ferreira
ferreira.sf@gmail.com
blogs: www.codigoecafe.com
http://mcitpsc.com.br/
twitter: @NandosFerreira
Estudante de Tecnologia da Informao na UDESC Universidade do Estado de Santa Catarina. Trabalha com desenvolvimento de sistemas a 5 anos, parte deles
utilizando Delphi. Sempre em busca de boas prticas de desenvolvimento, metodologias
geise Design Patterns. Palestrante em eventos da comunidade MCITPSC onde tambm
contribui com posts sobre C# e Visual Studio.

D seu voto sobre este artigo, atravs do link:


Figura 15. Diagrama de caso de uso integrado com Team Foundation Server 2010

74 .NET Magazine Edio 93

www.devmedia.com.br/javamagazine/feedback

Feedback
eu
sobre e
s

A Java Magazine tem que ser feita ao


seu gosto. Para isso, precisamos saber
o que voc, leitor, acha da revista!

D
s

D seu feedback sobre esta edio!

edio
ta

Figura 14. Diagrama de atividades do caso de uso Efetuar Pagamento

om essas novas features de modelagem, temos uma ferramenta


C
mais completa tanto para o trabalho de um arquiteto quanto para
um desenvolvedor, alm de ser totalmente integrada com o ambiente
de ALM. Essa integrao facilita a divulgao de uma possvel mudana arquitetural em um projeto, no s entre membros da prpria
organizao, mas tambm em times geograficamente distribudos,
visto que o ambiente de ALM suporta esse gerenciamento.
A gerao de documentos baseados nos diagramas, tambm outro ponto excelente que pode contribuir para evitar o desperdcio
de tempo gasto com esse tipo de atividade. Outro ponto forte so
as extenses que podem ser criadas. possvel criar ou melhorar
recursos de acordo com a necessidade da organizao, enviar um
e-mail para o arquiteto do projeto quando houver uma alterao ou
uma violao acontecer, criar extenses para validar e padronizar
nomenclaturas de classes, mtodos etc. Esses so apenas alguns
exemplos do que podem ser feito com essa ferramenta.

Assista ao vdeo e descubra mais


sobre a Campus Party Brasil

Edio 93 .NET Magazine

75

Visual Studio 2010 para arquitetos de software

76 .NET Magazine Edio 93