Tuesday, 6 July 2010

Silverlight + RIA Services + WCF + SQL Server (Arquitectura 4-Tier)



Nas últimas semanas me foi pedido para elaborar uma prova de conceito que juntasse o melhor de vários mundos. Uma aplicação em Silverlight, base de dados SQL Server e uma arquitectura de 4 camadas (4-Tier).
A aplicação Silverlight não tinha muito que saber pois, é um género de agenda simples onde adicionamos, alteramos e apagamos contactos. Assim a aplicação contem 2 formulários: Lista de contactos e edição de contacto. Associados a estes formulários, forma programadas as três operações CRUD (Create, Update e Delete).

A dificuldade aqui era integrar a arquitectura nesta prova de conceito, pois, a implementação tradicional de RIA Services não permite que a lógica da aplicação esteja noutro servidor, mas, no mesmo que a aplicação Silverlight está a ser executada.
A complexidade da arquitectura deve-se ao facto termos que desagregar o User Interface (UI) da lógica de negócio (Business Layer) e ainda tornar indisponível servidor de base de dados para o User Interface como demostra o gráfico em baixo:


Podemos ver que o UI acede aos dados a partir do Servidor Aplicacional que está por detrás de uma Firewall. A ligação entre o servidor Web e o servidor aplicacional é feita a por uma porta específica e de forma segura, enquando o servidor de base de dados só permite ligações do servidor aplicacional para garantir a segurança de comunicação entre os servidores.

Assim, para suportar esta arquitectura o que fiz foi :
  • desenvolver uma aplicação Silverlight que usa RIA Service como Wrapper do serviço que está no Servidor Aplicacional. Esta solução torna que seja possível fazer um "push" dos objectos de negócio para a aplicação Silverlight sem que seja necessário criar projectos de partilha de recursos.
  • Desenvolver um componente RIA Service no servidor Web que possiblita a invocação dos métodos que desejamosComo podemos ver, temos três métodos no RIA Service que poderão ser usados pela aplicação Silverlight. Como este RIA Service não tem acesso à base de dados, não implementa o LinqToEntitiesDomainService, mas, DomainService. Desta forma para invocar estes métodos temos que fazer na aplicação Silverlight o seguinte:Todos os acessos a RIA Services são efectuados assincronamente, pelo que necessitamos de definir o evento Complete para a operação. Neste caso o evento de Complete refresca a lista de contactos.

    Por fim, o RIA Service deve conectar-se ao serviço WCF que está no servidor aplicacional dentro da zona de servidores protegida. O componente WCF no servidor aplicacional pode ser um serviço windows ou uma console application que vai estar à escuta na porta 4534 (podia ser qualquer uma, eu escolhi esta).
  • Por último desenvolve-se o serviço WCF no servidor aplicacional que vai estar à escuta na porta 4534 por solicitações. Configurei para que esta comunicação seja NetTcp para garantir privacidade e performance.
    Este serviço WCF efectua operações na base de dados (operações CRUD) e usa EF4 como ferramenta de ORM.
Desta forma foi possível ir de encontro aos requisitos do cliente e criar uma total separação entre o servidor Web e o servidor aplicação / base de dados. De forma nenhuma, alguém vindo da Internet pode aceder ao servidor aplicacional e à base de dados.
Foi assim garantida assim a segurança dos dados de ataques indesejados.

Paulo Aboim Pinto
Odivelas - Portugal

Thursday, 1 July 2010

Friday, 25 June 2010

Silverlight + RIA Service / WCF + Database

Basicamente desde do TechDays2010 que todo o meu tempo  tem sido usado a estudar Silverlight 4. Para meu espanto, esta plataforma está avançada o suficiente para começar a pensar em desenvolver aplicações na Internet usando somente Silverlight.

Silverlight tem uma estrutura semelhante ao WPF (Windows Presentation Fundation), mas com a diferença que está focada em correr aplicações num Browser. Quando falo em aplicações, estou a dizer isso mesmo. Com Silverlight é possivel desenvolvermos aplicações profissionais com um “interface polido” que já conheciamos de outras plataformas como Java ou Adobe Flash.

Para aceder aos dados, que alimentam a aplicação, a equipa da Microsoft disponibiliza um componente chamado RIA Services (RIA = Rich Internet Application) que com base num modelo de dados cria todos os métodos CRUD para que possamos desenvolver a nossa aplicação e integra-se com qualquer ORM, apesar de eu aconselhar Entity Framework 4 (EF4).

Outra forma de aceder aos dados é usando componentes WCF que já estejam desenvolvido na organização. Outro tipo de utilização de componentes WCF é quando queremos dispersar os componentes da nossa aplicação: WebServer que disponibiliza a aplicação Silverlight, Application Server que disponibiliza os WebServices / Componentes WCF e o servidor de base de dados.

Neste ponto a base de dados é algo realmente remoto numa aplicação, pois, quem vai criar a aplicação só tem que se preocupar com RIA Service ou WCF e o que é exporto por estes componentes.

Silverlight está também disponível no WindowsPhone. Assim podemos ter o mesmo ambiente no browser ou no telefone.
Estou convencido que o Silverlight é a próxima grande coisa a acontecer na informática.

Tuesday, 25 May 2010

Silverlight e WPF

Desde o TechDays 2010 que todo o meu tempo tem sido usado para estudar Silverlight e WPF.

O WPF (Windows Presentation Fundation) é claramente uma excelente forma de desenharmos as aplicações de futuro. Duvido que o WindowsForms vá desaparecer, mas, vai ser gradualmente substituido por esta forma hierarquica de representação das nossas aplicações.
Tem como inconviniente só poder ser executado em sistemas operativos Windows, pois, tenta tirar partido de tudo de bom que o sistema operativo tem para oferecer.

Já o Silverlight é uma agradável supresa. Tenho visto filmes e mais filmes sobre Silverlight, comprado livros, experimentado e não poderia estar mais espantado com o que podemos fazer.

Com Silverlight podemos finalmente desenvolver aplicativos para o browser sem a necessidade de aprender outa liguagem se não a que estamos habituados a usar, o C#.
Quem me conheçe sabe bem que detesto JavaScript (e até mesmo o Java) e sempre me fez impressão ter que aprender JavaScript para ter interfaces bonitos nos sites que desenvolvi.

I HATE JAVASCRIPT

Desta fotrma não é necessário aprender HTML, JavaScript, C# para desenvolver uma WebApplication com "interface rico". Usando o Silverlight só temos que saber construir forms em XAML e programar em C#... MAIS NADA.

Até hoje só com Adobe Flash é que podiamos criar sites com interfaces realmente ricos e dotar as nossas aplicações de um Look & Feel realmente poderoso, mas, como é que usamos o Flash para obter dados de uma base de dados, processar dados e envia-los de volta para a base de dados? Com muita dificuldade.
Esta simples acção é feita no Silverlight de uma forma natural. Em Silverlight não fazemos só animações, mas, aplicações completas.

Mesmo que isto fosse muito, ainda temos a possibilidade de instalar e correr as nossas aplicações Silverlight Out-Of-Browser. Estas aplicações, apesar de terem um acesso limitado ao disco e ao sistema operativo, são executadas a partir do computador do cliente e usar o protocolo HTTP para comunicar com o servidor.
Só boas notícias.

Irei publicar o que tenho descoberto sobre Silverlight e WPF e espero pelos Vosso FeedBack.


Paulo Aboim Pinto
Odivelas - Portugal

Thursday, 11 February 2010

Hoje ganhei a minha primeira batalha com a ADO Entity Framework!

No CMS que estou a desenvolver - Olimpo CMS - sempre tive como requisito principal a modulidade. Assim sendo, cada módulo, para além de ser responsável pelas suas acções, é também responsável pelas suas tabelas e seus dados. Não faz sentido o módulo de criação dos menus ter acesso as tabelas com os componentes de cada página e vice-versa.

Sendo assim, faz todo o sentido que a ConnectionString seja partilhada por todos os módulos, ou pelo menos que esteja em local partilhado, já que cada módulo pode obter os seus dados do repositório de dados que entender.

Vamos imaginar que está tudo na mesma base de dados, colocamos a ConnectionString no Web.Config do WebSite tudo iria correr bem! Não poderíamos estar mais errados. Com a Entity FrameWork, temos que agora o conceito de MetaData que é onde está descrito os objectos criados e os seus mapeamentos. Sem a MetaData não é possível usar o ADO Entity FrameWork neste exemplo modular, pois, cada módulo necessita, adicionar ao Web.Config a sua ConnectionStrings e a sua MetaData.

O que fiz para resolver este assunto? Simples, no Web.Config coloco a  ConnectionString sem a informação de MetaData e adiciono essa informação em cada módulo quando invoco o objecto EntityModel respectivo, assim:

EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.Provider = "System.Data.SqlClient";
            entityBuilder.ProviderConnectionString = @"Server=LENOVO-PAP\SQLEXPRESS;Initial Catalog=TEST.NET;Integrated Security=True;MultipleActiveResultSets=True";
            entityBuilder.Metadata = @"res://*/NewModel.csdl|res://*/NewModel.ssdl|res://*/NewModel.msl";

Agora, basta invocar o objecto ADO.NET Entity gerado com a nova connection string.
            Entities model = new Entities(new EntityConnection(entityBuilder.ToString()));
            var lstRET = model.AAA_User.ToList();

Desta forma é possível com uma ConnectionString associar a qualquer objecto ADO.NET Entity sem termos que ter várias ConnectionStrings no Web.Config.

NOTA: Neste exemplo a ConnectionString está hardcoded, mas, no projecto final é para obtermos a partir do Web.Config.


Paulo Aboim Pinto

Wednesday, 10 February 2010

Buzz, o novo Google Wave.

Hoje a internet acordou com a notícia da entrada do Google nas redes sociais com o Google Buzz. Logo que abri o meu GMail (como faço todos os dias de manhã) tinha a mensagem a dizer que podia aderir ao Google Buzz e  foi o que fiz.

Devo dizer que gostei. Tem algumas funcionalidades interessantes que não conseguimos ter com o Twitter, mas, que o FaceBook já tinha implementado. Por exemplo, ao responder a uma mensagem de um amigo, ela fica em jeito de Reply invés de ser uma nova mensagem. Isso é chato no Twitter, pois, manter uma conversa com alguém pode ser muito xato.

Outra coisa que gostei foi do retirar da limitação dos 140 caractares. É verdade que isso é que fez com o que Twitter seja o que é hoje, mas é uma limitação xata para não dizer mesmo sem sentido.

Em conversa com uma amiga minha (ainda de manhã) demos por nós a falar sobre a estratégia do Google em relação ao Google Wave. Devo dizer que sou fã das Waves e ainda uso frequentemente em reuniões, para fazer algum BrainStorming e para tirar notas. Posso dizer que o Google Wave é o meu Notepad online. O que mais gosto ainda é a possoibilidade de poder partilhar essas minhas notas com outras pessoas.
Claro que estou aborrecido com o facto de ainda não poder enviar mensagens para fora do Google Wave, por exemplo, transformar uma Wave numa mensagem de correio electrónico e enviar para alguém e ainda ao receber a resposta dessa pessoa, poder arquivar na Wave.

Devido a esta pequena (grande) limitação do Google Wave, as pessoas não aderiram tanto a este serviço, assim, perdeu-se o impto inícial à volta das Waves. Eis que a Google aparece com este add-on ao GMail que é o Buzz. Se olharmos bem, a ideia de enviarmos mensagens a outros pessoas e poder responder em forma de árvore é muito parecido ao estilo do Google Wave. Até quando alguém nos responde e temos o Buzz aberto a forma como a resposta aparece é muito ao estilo do Google Wave.

Não será o Buzz uma forma de aproximação das pessoas ao Google Wave?

Vamos ficar à espera do que a Google irá fazer a seguir.


Abraços
Paulo Aboim Pinto

Friday, 29 January 2010

Último dia na Altran

Bem, hoje é o meu último dia na Altran. Entrei aqui, ainda na Altrantec, fundi-me com a Altior e ficamos todos Altior e por último fundi-me com a Altran-CIS para sermos uma só empresa, Altran Portugal.

Estive envolvimento em bons projectos e tenho a certeza que tudo fiz para fazer um bom trabalho. Trabalhei para a CP, ZON, Alcatel, Arval, AIGLife sempre com C# .NET.

A partir de segunda-feira vestirei outra camisola e irei para outro projecto, mas, isso é uma outra história.


Paulo Aboim Pinto