Wednesday 14 July 2010

JavaScript vs Silverlight - Please don't feed the trolls

Foi criado um Flame Post no JupiterJS.com que só server para alimentar alguns trolls que por ai andam intitulado "JavaScript vs Silverlight".
Estava eu a pensar numa forma de blogar sobre o assunto e eis que o Laurent Bugnion, criados no Light MVVM para WPF, Silverlight e WP7 respondeu da melhor forma.

Ao texto dele gostaria de acrescertar algo sobre debuging em .NET e JavaScript. Não só é completamente diferente como é antagónico. Desde que conheci sistema de debug facultado pela Microsoft que não quero um que tenho que fazer print do resultado das variáveis para o ecrã.
Considero contra-produtivo e até mesmo castrador no avanço do trabalho!

Outro ponto é a homogeneização do código. Quando estamos a programar em JavaScript temos que conhecer dezenas (quando não são mais) frameworks e que nem sejam coexistem entre si. Temos ainda que dominar o HTML para apresentação final e o Java para servir de Data Access Layer com a base de dados.
No Silverlight só temos que entender e saber de uma linguagem: C#. Para os mais radicais temos também o XAML que não é mais que uma representação dos ecrãs. O código de User Interface, de negócio e ainda o acesso aos dados é todo desenvolvido na mesma linguagem.

Para um gestor é muito melhor escolher uma equipa multi-disciplinar nas funções que também estar dependente dos conhecimentos sobre as diversas linguagens.

Pelas razões expostas pelo Laurent Bugnion e pelas que aqui tentei acrescentar a minha escolha é obviamente Silverlight.
Podem ler a sua resposta aqui.


Paulo Aboim Pinto

Tuesday 13 July 2010

BUGS? Só entre a cadeira e o teclado!

Pois é, venho vos falar de um erro que me assombra desde sexta-feira e que passei o fim de semana todo a pensar nele e só hoje é que descobri o que estava a acontecer.

Depois do post anterio, resolvi melhorar o meu código (ahahahah melhorar!!!!) e criar uma separação de responsabilidades em assemblies diferentes. Começei então pelo RIA Service que separei do projecto Web que estava inserido.

Ao fazer isto tudo deixou de funcionar. Passei a ter o seguinte erro:

Operation named 'GetContacts' does not conform to the required signature. Return types must be an entity, collection of entities, or one of the predefined serializable types.


Este erro explica muito pouco o que está a acontecer, mas, depois de lamber muias páginas descobri que não posso ter a seguinte declaração de método:

[Invoke]
public IEnumerable GetContacts(string name) { return null; }

Esta declaração não é possível porque se tiver que retornar uma lista (IEnumerable<>, IList<>, etc), este método necessita ser [Query] e não [Invoke].

Mesmo sabendo que isto já funcionou como o [Invoke] mudei para [Query], mas, ocorria outro erro estranho, o meu código nunca entrava no RIA Service e obtinha sempre um erro a indicar que o servidor indivaca que o método não tinha dito encontrado.

Mais lambidelas de páginas e mais páginas e nada... eis que me recordei que tinha um projecto simples na minha máquina que funcionava. O problema é: FUNCIONA PORQUE?

A razão é simples: Invés de criar o meu RIA Service com Add -> New Item -> Domain Service, estava a criar uma nova class e decorava-a com [EnableClientAccess].
Quando cria-se pelo template são adicionadas referências e um conjuntos de declarações using que eu não estava a fazer e por isso não funcionava.

Infelizmente demorei 4 dias para descobrir este erro simples e espero que vcs não tenham que passar por isso!


Paulo Aboim Pinto

Tuesday 6 July 2010

Silverlight também nos Nokias!!

Ora ai está uma boa notícia. Enquanto outras plataformas limitam o acesso da tecnologia, outras aumentam o leque de equipamentos onde podemos usar a tecnologia. A última notícia é que o Silverlight também corre em Nokias.

Com esta notícia podemos dizer que o Silverlight corre sistemas Windows, MacOsX, Linux, WindowsPhone, Symbian (Nokia)

Source: http://www.silverlight.net/getstarted/devices/symbian/

Paulo Aboim Pinto
Odivelas - Portugal

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