Web Service como Persistência

 

Este artigo é o resultado de um estudo que fiz sobre como minorar o dispêndio de procedimentos laborativos durante o desenvolvimento de aplicações que consomem Web Services. É minha intenção dispor essa idéia para toda comunidade interessada no assunto.

É comum implementar-se inúmeras classes, uma para cada tabela ou funcionalidade no Web Service. Contrariando esse tradicionalismo consegui montar um esquema de fácil construção.

Buscamos uma forma de se trabalhar com Web Service como uma camada de Persistência, tornando o trabalho de desenvolvimento mais produtivo e usando o melhor que as ferramentas RAD (Rapid Application Development) oferecem, apenas clicando e arrastando as tabelas e/ou seus respectivos campo, utilizando pouca codificação para os métodos de gravação e de navegação.

Bem, vamos ao que interessa. Utilizaremos o Visual Studio Team Suite para exemplificar este estudo.

Dentro do Server Explorer, mostrado na tela abaixo, observamos a existência de uma conexão com uma base de dados SQL Server cujo nome é Agenda e que está no servidor TI-09.

TelaWebService001.jpg

Agora iniciaremos um novo projeto do tipo Web Service. Vá no menu File à New à Web Site e escolha ASP.NET Web Service.

TelaWebService002.jpg

OBS: Como no computador que fiz este artigo está instalado o IIS (Internet Information Services), logo, configurei em Location para HTTP. Se em seu computador não estiver instalado o IIS, você pode optar pelo servidor embarcado Web do Visual Studio 2005 escolhendo em Location a opção File System.

Assim que é gerado o Web Service, por padrão, é criada uma classe de nome Service.cs que fica localizada na pasta APP_CODE. Iremos trabalhar com esta classe mais adiante.

TelaWebService003.jpg

Clicaremos com o botão direito sobre a pasta APP_CODE e escolheremos a opção Add New Item...

Em seguida, já na Janela de Templates, selecionamos a opção DataSet e trocamos o  nome do arquivo para dsAgenda.

TelaWebService004.jpg

Aparecerá uma janela para configurarmos através do Wizard (assistente) o TableAdapter. Selecionamos a conexão que você fizemos anteriormente, e clicamos em Next.

TelaWebService005.jpg

Na próxima tela teremos a opção de gravar ou não a Connection String na aplicação para utilizá-la futuramente quando for necessário. O comum é armazenar. Depois da escolha, clicamos em Next.

TelaWebService006.jpg

Nesta tela encontraremos algumas opções para o acesso e armazenamento de dados nas tabelas dos banco de dados. A primeira opção o Wizard criará os comandos de Select, Update e Delete de cada tabela encontrada no DataSet. A segunda será através da criação de Stored Procedures, e a última é o uso de Stored Procedures existentes no banco. A primeira opção é a que escolheremos, por ser um banco de dados modelo.

Já na tela que se segue, nos é permitido entrar com um Select de uma tabela ou simplesmente usar o Query Builder para selecionarmos a tabela desejada. Utilizaremos a opção do Query Builder.

TelaWebService007.jpg

Aqui vemos a tela do Query Builder, para esse exemplo, selecionamos a tabela Pessoa e seus respectivos campos. Abaixo utilizamos o Select necessário para obter os dados dessa tabela.

TelawebService008.jpg

Depois de construído o Select, serão criados dois métodos no TableAdapter desta tabela : GetData, responsável pelo select na tabela, e Update, responsável por insert, delete e update.

TelaWebService009.jpg

Pronto, finalizado a construção do DataSet dsAgenda, é só clicarmos em Finish para visualizarmos o resultado.

TelaWebService010.jpg

Podemos agora visualizar o DataSet dsAgenda e a tabela contida dentro dela. Se desejarmos adicionar a tabela Estado, por exemplo, basta clicar sobre ela de dentro do Server Explorer e arrastar até o dsAgenda que se encontra aberto.

TelaWebService011.jpg

Ao selecionarmos o PessoaTableAdapter, podemos ver os comandos do Select, Update, Insert e Delete. Em banco de dados diferentes do SQL Server, teríamos que fazer estas rotinas “na mão” devido às particularidades do provider (biblioteca que faz acesso aos dados).

TelaWebService011b.jpg

Bem, vamos agora à parte codificada do WebService que é bem simples de se entender.

Voltamos para o Service.cs e retiramos o método HelloWorld() que já vem por padrão, e adicionamos o método ObterEsquema(), como mostrado abaixo.

/// <summary>

/// Retorna o Esquema do DataSet

/// </summary>

/// <returns>dsAgenda</returns>

[WebMethod]

public dsAgenda ObterEsquema() {

    return new dsAgenda();

}

Este método fará com que as aplicações .NET, que consumirem este WebService, vejam em seu Data Object o dsAgenda como fonte de dados.

Agora adicionaremos mais dois métodos para esta tabela, uma para obter os dados e outro para gravar os dados.

/// <summary>

/// Obter dados de Pessoa

/// </summary>

/// <returns>PessoaDataTable</returns>

[WebMethod(Description = "Obtendo os dados da tabela Pessoa")]

public dsAgenda.PessoaDataTable tbPessoa()

{

    dsAgendaTableAdapters.PessoaTableAdapter adapter

        = new dsAgendaTableAdapters.PessoaTableAdapter();

    return adapter.GetData();

}

 

/// <summary>

/// Atualizar dados de Pessoa

/// </summary>

/// <param name="tab">PessoaDataTable</param>

/// <returns>Numero de linhas Afetadas</returns>

[WebMethod(Description="Atualiza os Dados da tabela Pessoa")]

public int tbPessoaAtualiza(dsAgenda.PessoaDataTable tab)

{

    dsAgendaTableAdapters.PessoaTableAdapter adapter =

        new dsAgendaTableAdapters.PessoaTableAdapter();

    return adapter.Update(tab);

}

Pronto, o WebService está ok. Vamos rodar e testar o WebService. Quando o WebService for executado, ele aparecerá assim como mostrado abaixo. Clique no método tbPessoa para testá-lo.

TelaWebService012.jpg

Clique no botão Invoke para invocar o método

TelaWebService013.jpg

Visualize o resultado em uma estrutura XML. Se apareceu como mostrado na tela abaixo, tudo ocorreu corretamente.

TelaWebService014.jpg

Faremos agora uma aplicação Windows Form para consumir o Web Service criado.

Iremos abrir outra instância do Visual Studio 2005 (caso você não tenha o IIS instalado em sua máquina).

Criaremos um projeto Windows Application com o nome TestaWSAgenda.

TelaWebService015.jpg

A primeira coisa que devemos fazer é uma Web Reference para o Web Service criado. Então, vamos ao Solution Explorer e clicamos com o botão direito em Reference e escolha a opção Add Web Reference, colocamos em Web reference name o nome WSAgenda e clicamos em Add Reference.

TelaWebService016.jpg

Vamos ao menu Data e escolhemos a opção Show Data Sources. Observe que o dsAgenda já aparece como fonte de dados. Agora pegamos a tabela Pessoa e arrastamos para dentro do formulário Form1.

TelaWebService017.jpg

Ao clicarmos na tabela Pessoa e arrastarmos até o formulário, serão adicionados os componentes BindingSource, BindingNavigator, dsAgenda e DataGrid.

Vamos aproveitar e arrastar os campos individualmente para que o formulário fique com a aparência abaixo.

TelaWebService018.jpg

No evento Load do formulário adicionamos o seguinte código:

private void Form1_Load(object sender, EventArgs e)

{

    WSAgenda.Service ws = new WSAgenda.Service();

    pessoaBindingSource.DataSource = ws.tbPessoa();

}

Alteramos a propriedade Enable do botão da barra de navegação que tem uma figura de “Disquete” para true e clicamos duas vezes sobre ela para adicionarmos o evento Click:

private void pessoaBindingNavigatorSaveItem_Click(object sender, EventArgs e)

{

    WSAgenda.Service ws = new WSAgenda.Service();

    int linhasAfetadas =

        ws.tbPessoaAtualiza((WSAgenda.dsAgenda.PessoaDataTable)pessoaBindingSource.DataSource);

    MessageBox.Show("Foram afetadas " + linhasAfetadas.ToString() + " linhas",

        "Update", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

Compilamos a aplicação para teste.

TelaWebService019.jpg

Conclusão

 

Trabalhando desta forma, teremos pouca codificação, atividades menos complexas e ganho de produtividade no desenvolvimento de aplicações que consomem WebService como camada intermediária.