Israel Aéce

Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT

My Links

Blog Stats

Archives

Post Categories

Links

Login

Service is running.

Há aproximadamente dois meses iniciei um projeto onde tive que construir um Windows Service (ou WinService). Pois bem, a finalidade do mesmo é resgatar os registros de uma determinada Base de Dados e enviar para um orgão chamado SERASA.

Este orgão tem a finalidade de fornecer informações sobre créditos e restrições financeiras, entre outros documentos e serviços, relacionados à pessoas físicas ou jurídicas (Empresas). Eles fornecem várias formas de resgatar do cliente e devolver para o mesmo tais informações. Alguns dos meios são Sockets, HTTPs e algo que não estou recordando agora (uma solução da IBM).

Como a idéia era criar tudo em .NET, fomos logo lá entender o problema. Ao cadastrar os Clientes na Base de Dados de um sistema interno (desenvolvido em Delphi), o serviço deverá correr sem nenhuma intervenção humana (claro, é esta a finalidade de um WinService) e automaticamente gerar a String de envio e receber o valor de retorno do SERASA. Vale lembrar que muitas vezes, o retorno não é imediato, tendo assim que ficar de tempo em tempo enviando uma String para checar se o lote que foi enviado já foi ou não processado.

Para que o processo corresse corretamente, tivemos que nos atentar à algumas condições, pois existiam seis tipos de documentos a serem enviados e recebidos. O processo de resgate dos dados da Base de Dados, a geração da String de envio, o recebimento e análise do retorno e a persistência na DB são iguais para todos, ou seja, os passos a serem executados devem ser exatamente os mesmos. A solução neste caso, foi criar uma classe Base que implementa um Template Method e dentro dele define os passos do algoritmo, deixando as subclasses (as classes derivadas) implementarem os métodos como eles devem ser, ou seja, é exclusivo para cada subclasse, pois a geração da String de envio por exemplo é diferente entre os tipos de documentos a serem enviados.

Bem, depois do envio e recebimento OK, vem a parte da persistência dos dados retornados pelo SERASA na Base de Dados. Neste caso, tenho cerca de 23 tabelas com média 15 à 30 campos em cada uma delas. Como tenho os meus objetos na minha aplicação e não queria criar uma DAL/DAO para resgatar os dados e assim popular cada um dos meus objetos, e estes por sua vez adicionar à coleção adotamos o NHibernate (ferramenta de OR/M), e com isso, diminuiu à 0 (Zero) a escrita de códigos T-SQL e Stored Procedures.

Por fim, é criado as Threads que são necessários para que essas "rotinas" corram "side-by-side", e assim aumentando a facilidade e produtividade interna da empresa que está a utilizar este WinService.

posted on Thursday, October 28, 2004 10:17 PM

Feedback

# re: Service is running. 10/29/2004 1:02 PM rbfigueira

Pelos visto o NHibernate motivou-te :P
Mais uma vez vemos que a utilização de Patterns é importante :)

Parece ter sido um trabalho interessante de fazer !

Um abraço

# re: Service is running. 10/29/2004 1:53 PM Israel Aece

Ola Ricardo,

Olha realmente não queria ficar a escrever muitos codigos T-SQL, mesmo porque nao tenho muita paciencia para isso, logo o uso do NHibernate foi uma boa escolha.

Se tivesse apenas a utilizar uma DAL convencional, provalmente este post ia demorar um pouco mais para ser publicado.

Agora estou a criar a documentação do serviço. Como não é um Framework, estou tendo até que comentar métodos privados! Oh My God! E como ainda escrevi o programa em VB.NET, tenho que utilizar ferramentas de terceiros como o VBCommenter e o NDoc para gerar a tal documentação.

Mas bem Ricardo, foi mesmo uma boa experiência, pois ainda não tinha trabalho com nenhum outro tipo de aplicação a não ser ASP.NET. Em breve comecarei a trabalhar em um novo projeto que utilizará WebServices, e bem, tá ai algo que ainda também não explorei :)

Obrigado pelo comentário.

# re: Service is running. 10/30/2004 4:01 PM Jose Antonio Silva (MS)

Uma recomendação para outros projectos destes que venhas a realizar no futuro:
Estou convencido que este cenário implementado em Biztalk é muito mais adequado do que qualquer desenvolvimento de serviços/modelosRelacionais/LayersDAL/Persistencia/OO_RelacionalMappers/Threads/CorrelaçãoRespostas/etc...

E por falar em Patterns, recomendo este whitepaper sobre "Integration Patterns" e a sua implementação com Biztalk 2004:
http://www.eaipatterns.com/docs/integrationpatterns_biztalk.pdf

# re: Service is running. 10/30/2004 4:47 PM Gilberto Neto

Eh, o Israel gostou mesmo do NHibernate, to só no aguardo do artigo que ele está escrevendo pra ver se algo me motiva a não criar as minhas amigas, as stored procedures no sql server! hehehehe

# re: Service is running. 10/30/2004 7:24 PM Israel Aece

Ola Jose Antonio,

Obrigado pelo comentario. Pois bem, nao conheco la muito BizTalk, vou procurar ler o documento que me indicou. Agradeco mesmo.

Boas Gilberto,

Sim, só o fato de nao ter que popular os teus objetos manualmente e nao ter que escrever codigo T-SQL ja me faz optar pelo NHibernate :)

Mas se gosta tanto de SQL, acho que teu negocio é mesmo ser somente DBA :P

Abs,

# re: Service is running. 11/1/2004 11:46 AM Gilberto Neto

Heheheeh... esse eh meu sonho desde criança! Mas aqui no meu estado não existe a profissão DBA :) heheheheh

Abraços

# re: Service is running. 5/22/2006 3:19 PM Gisele Bellon

Israel,

Estive lendo alguns artigos de como tratar concorrência de dados, mas achei exemplos somente utilizando DataSet, e eu costumo usar List genérica para carregar dados.
Também li seu artigo sobre NHibernate e notei que há uma maneira de controlar transações utilizando-o.
Existe uma maneira de controlar concorrência usando NHibernate, você teria algum exemplo? Estou procurando a melhor alternativa para controlar concorrência, já que também não gosto de escrever muito SQL.

Obrigada!!!

# re: Service is running. 5/26/2006 3:46 AM Israel Aece

Ola Gisele,

Sim, há possibilidades. Peço a gentileza que de uma olhada nas documentações do NHibernate que encontrará muito material interessante.

Title  
Name  
Url
Box Code
Protected by FormShield
Comments