.NET - Usando o Subsonic II (Gerando a sua Camada de acesso a dados)


Neste artigo eu vou mostrar como usar o Subsonic para gerar a sua camada de acesso a dados , os scripts para criação do banco de dados e da tabelas e também como usar o recurso Scaffolding para gerar o suporte para manutenção dos seus dados. Acompanhe o primeiro artigo com a  introdução ao Subsonic aqui.

O ponto de partida para usar o Subsonic e saber o que você realmente quer e para onde você deseja ir.

Você realmente precisa de uma camada de acesso a dados ? (e quem não precisa ?)

Você já definiu os requisitos da sua aplicação , as entidades e já tem o modelo de dados normalizado ?

Se você já tem estas informações definidas pode usar o Subsonic para ajudá-lo a criar a sua camada de acesso a dados, gerar os scripts, o seu protótipo, e otras cositas más...

Configurando o Subsonic

Neste ponto você já deve ter feito o download do Subsonic. No momento que este artigo foi escrito (abril/2009) você obtinha o projeto source compactado que você deveria descompactar na sua máquina local.

Após isso abra o projeto  no Visual Studio 2008 ou no VWD 2008 e efetue um build do projeto para gerar o arquivo subsonic.exe. Eu descompactei o pacote na pasta Arquivos de Programas e obtive a estrutura conforme figura abaixo:

Os arquivo subsonic.exe e subsonic.dll que devem ser usados no projeto estão na pasta SubCommander\bin\Debug;

Tudo isso pode mudar se for disponibilizada uma nova versão. Fique atento !

Neste artigo eu vou usar o Visual Web Developer 2008 Express  e o banco de dados Northwind.mdf do e SQL Server 2005 Express. Veja abaixo uma figura onde temos o diagrama gerado no VWD 2008 mostrando os relacionamentos das tabelas do Northwind.mdf:

Nota: O Subsonic também dá suporte a outros banco de dados como: Oracle, MySQL, SQlLite, PostGreSQL (O Microsoft Access não é suportado)

A string de conexão para o banco de dados Northwind.mdf usado neste exemplo é :

Data Source=MAC\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True

perceba que MAC\SQLEXPRESS refere-se ao nome do meu servidor SQL Server local o que no seu caso deverá ser informado o nome do seu servidor.

Então já temos duas informações essenciais :  O banco de dados e a string de conexão. Estas informações serão usadas para configurar o Subsonic.

Criando o projeto web

Vamos então criar um novo web site usando o VWD 2008 através do menu File->New web site escolhendo o template ASP .NET Web Site, a linguagem C# e informando o nome subsonic_DAL;

A primeira coisa a fazer será criar uma referência ao Subsonic no seu projeto.

Nota: Devemos referenciar o arquivo subsonic.dll que esta no projeto

Referenciando o Subsonic

Para referenciar o Subsonic no seu projeto clique com o botão direito sobre o nome do projeto ou no menu  Web Site para aplicações Web ou Project para aplicações VB selecione a opção Add Reference;

A seguir clique na guia Browse e selecione a pasta onde você instalou o Subsonic e selecione o arquivo Subsonic.dll;

Ajustando o arquivo web.config

Vamos agora abrir o arquivo web.config e preparar o ambiente para usar o Subsonic. Teremos que efetuar 3 ajustes no web.config conforme abaixo:

1- Declarar uma seção de configuração para o Subsonic

<configSections>

    <section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" requirePermission="false"/>

</configSections>

2- Definir a string de conexão com o seu banco de dados. Abaixo temos um exemplo para o conexão com o banco de dados Northwind.mdf;

<connectionStrings>

  <add name="Northwind" connectionString="Data Source=localhost\SQLExpress; Database=Northwind; Integrated Security=true;"/>

</connectionStrings>

Atente para o nome que usamos na string de conexão : Northwind. Esse nome deverá ser usado na última etapa abaixo para indicar qual string de conexão estamos usando.

3- Definir o provedor usado pelo Subsonic

<SubSonicService defaultProvider="Default">

  <providers>

      <!-- Referencia a string de conexao definida na sec‡Æo connectionStrings -->

      <!-- Suporte as MySQL, Oracle, SQL2000, SQL2005, SQLCE, SQLLite at‚ agora -->

        <add name="Default" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="Northwind" generatedNamespace="Northwind"/>

 </providers>

</SubSonicService>

Observe o nome do namespace que definimos para acessar as classes geradas em: generatedNamespace="Northwind"

Executando o Subsonic a partir da linha de comando

Podemos usar o recurso das ferramentas Externas (External Tools)  para gerar um script de comando que será executado a partir do menu Tools do Visual Web Developer (esta opção também existe no VS 2008).

Para isso selecione o menu Tools e clique em External Tools e defina as opções conforme a figura abaixo:

 Com isso estaremos criando um item no menu Tools chamado Subsonic DAL que usa o arquivo sonic.exe para gerar as classes da nossa camada de acesso a dados.

Os argumentos usados são:

generate /auto

O diretório inicial será o diretório do projeto: $(ProjectDir)

Marcamos as opções Use OutPut Window e Prompt for arguments para exibir uma janela onde poderemos fornecer mais argumentos como a pasta onde iremos gerar as classes.

Um argumento de linha de comando muito importante  é o argumento /lang vb que irá gerar as classe na linguagem Visual Basic. Se você não informar este argumento o padrão de geração das classes será a linguagem C#.

A seguir uma relação dos principais comandos que podem ser usados:

Um recurso muito importante e que poupará muito o seu trabalho é a geração dos Scripts para gera o banco de dados e as tabelas. Podemos criar esta opção usando o mesmo recurso das Ferramentas Externas da seguinte forma:

Selecione o menu Tools e clique em External Tools e defina as opções conforme a figura abaixo:

Conforme a figura ao lado estaremos gerando os arquivos de scripts para criar o banco de dados e as tabelas e o script para preencher as tabelas na pasta ScriptsSQL.(Serão gerados dois arquivos de scripts.)

O menu Tools estará exibindo os dois itens criados conforme abaixo:

Já temos tudo pronto para gerar a nossa camada de acesso dados e os scripts SQL para gerar as tabelas e populá-las.

Vamos criar uma pasta chamada DAL para conter as classe geradas. Clique com botão direito sobre o nome do projeto e selecione New Folder criando a pasta DAL no seu projeto.

Agora abra o menu Tools e clique na opção Subsonic DAL. Será apresentada a janela para executar o Subsonic informe o local onde as classes serão geradas , no nosso exemplo na pasta DAL do projeto e clique em OK;

Neste momento se tudo estiver corretamente configurado e definido o Subsonic irá gerar as classes na pasta DAL. Veja abaixo o resultado obtido onde temos o log de execução do Subsonic e as classes geradas na pasta DAL;

Para gerar as classes da camada de acesso a dados o Subsonic lê a estrutura do seu banco de dados e cria as classes para cada tabela correspondente. O Subsonic gera então 3 classes para cada tabela do banco de dados da seguinte forma:

  1. Uma classe para cada tabela: Se você tem uma tabela chamada Produtos será gerada a classe Produto que é fortemente tipada e representa cada linha da tabela; Cada coluna da tabela será representada por uma propriedade na classe;
  2. Uma classe coleção que fornece métodos para tratar coleção de linhas no banco de dados. Se você tem uma tabela Produtos será gerada a classe ProdutoCollection;
  3. Uma classe controladora (ex: ProdutoController) que fornece as funcionalidade básicas para incluir, alterar, excluir e consultar (CRUD);

Podemos dizer que as classes geradas já possuem métodos para listar, inserir, alterar e excluir os registros da tabela correspondente.

Agora é só alegria.

Para acessar as classes e seus métodos basta usar o namespace Northwind definido no arquivo de configuração.

Neste ponto eu vou mostrar uma outra forma de obter o mesmo resultado mas ocultando as classes geradas.

Nota: Você pode excluir a pasta DAL e o seu conteúdo.

Vamos usar uma opção de configuração para gerar as classes da sua camada de acesso a dados 'por trás dos panos' , assim elas ficam ocultas no seu projeto, nesta opção você não terá acesso aos arquivos. Para usar este recurso você tem que declarar um BuildProvider no seu arquivo web.config.

Um BuildProvider é um processo que roda quando o Visual Studio compila uma aplicação ou quando um arquivo é incluído na pasta App_Code. No nosso caso vamos definir um BuildProvider para irá ser executado para cada arquivo na basta App_Code que tenha a extensão .abp, o que é feita sob a tab <compilation>.

Então para usar o recurso do buildprovider basta incluir a seguinte entrada no arquivo web.config:

  1. <configuration>  
  2.   <system.web>  
  3.     <compilation>  
  4.       <buildProviders>  
  5.         <add extension=".abp" type="SubSonic.BuildProvider, SubSonic"/>  
  6.       </buildProviders>  
  7.      </compilation>  
  8.   </system.web>  
  9. </configuration>  

Após concluir esta etapa vamos ter que criar a pasta App_Code no projeto. Clique com o botão direito do mouse sobre o nome do projeto e selecione Add ASP .NET Folder -> App_Code;

A seguir clique com o botão direito sobre a pasta App_Code e selecione Add New Item;

A seguir selecione Text File e informe o nome subsonic.abp (a extensão .abp é obrigatória);

Abrindo o arquivo subsonic.abp digite o caractere * (asterisco) e salve o arquivo;

Agora no menu Build aplique Build Web Site e pronto as classes serão geradas de forma automática.

Vamos provar...

Realizando consultas com a camada de acesso a dados gerada pelo Subsonic

Agora vamos ver alguns recursos que o Subsonic nos forneceu para geração de consultas usando a camada de acesso a dados gerada e também o próprio Subsonic.

Para facilitar nosso trabalho eu vou incluir dois imports no projeto:

using Northwind;
using
SubSonic;

Eles apenas facilitarão nosso trabalho de digitação.

Selecione a página Default.aspx e a partir da ToolBox inclua um componente GridView na página;

A seguir abra o arquivo Default.aspx.cs e no evento Load do formulário form1.cs inclua o código abaixo:

protected void Page_Load(object sender, EventArgs e)
{
   CategoryCollection
categorias = new CategoryCollection().Load();
   GridView1.AutoGenerateColumns = true;
   GridView1.DataSource = categorias;
   GridView1.DataBind();
}

Este código irá exibir os dados da tabela Categories conforme abaixo:

Podemos fazer o mesmo para cada tabela do nosso modelo. Dessa forma poderíamos exibir os dados para cada uma das tabelas usando mesmo código somente alterando a coleção usada:

  ProductCollection produtos = new ProductCollection().Load();
   GridView1.AutoGenerateColumns = true;
   GridView1.DataSource = produtos;
   GridView1.DataBind();

 

CustomerCollection clientes = new CustomerCollection().Load();

GridView1.AutoGenerateColumns = true;

GridView1.DataSource = clientes;

GridView1.DataBind();
 

Exibe a tabela Product Exibe a tabela Customer

Gerando os scripts para criação o banco de dados e tabelas

Um recurso muito importante e que poupará muito o seu trabalho é a geração dos Scripts para gera o banco de dados e as tabelas. Podemos criar esta opção usando o recurso das Ferramentas Externas da seguinte forma:

Selecione o menu Tools e clique em External Tools e defina as opções conforme a figura abaixo:

Conforme a figura ao lado estaremos gerando os arquivos de scripts para criar o banco de dados e as tabelas e o script para preencher as tabelas na pasta ScriptsSQL.(Serão gerados dois arquivos de scripts.)

O menu Tools estará exibindo os dois itens criados conforme abaixo:

Abrindo o menu Tools e selecionando a opção Gerar Scripts SQL conforme mostrada acima irá gerar dois arquivos em uma pasta ScriptsSQL do seu projeto conforme mostrado na figura a seguir:

  1. 2009_4_11_macoratti_Default_Schema.sql - O arquivo contendo os comandos SQL para gerar as tabelas;
Arquivo de scripts SQL - 2009_4_11_macoratti_Default_Schema.sql
  1. Default_Data_2009_4_11.sql - arquivo com comandos SQL para popular as tabelas com dados;   
Arquivo de scripts SQL - Default_Data_2009_4_11.sql

Imagine que com pequenos ajustes e alguns cliques de mouse você será poupado de um trabalho intenso.

Usando o recurso Scaffolding

O Scaffolding gera em tempo de execução todo o código necessário para realizar as operações de inclusão, alteração, exclusão e listagem, as operações CRUD, sem você ter que digitar quase nenhuma linha de código.

Scaffolding é um termo em inglês de engenharia civil, que denota a colocação de andaimes e outras estruturas para suportar temporariamente trabalhadores de maquinário enquanto a construção definitiva não está pronta. Esse mesmo termo é usado em programação para indicar que o código a que se refere é apenas um esqueleto usado para tornar a aplicação funcional, e se espera que seja substituído por algoritmos mais complexos a medida que o desenvolvimento da aplicação progride.

Para usar este recurso basta referenciar o componente na sua aplicação. Você pode fazer isso declarando o componente Subsonic na sua página ou no definindo a referencia arquivo web.config o que o tornará válido para qualquer página do seu projeto.

Basta incluir a seguinte tag  : <add tagPrefix="ss" assembly="SubSonic" namespace="SubSonic"/>

...
 <
pages>

 <controls>

  <!--incluindo a tagprefix do SubSonic tagprefix aqui fica disponivel para todas as páginas.-->

    <add tagPrefix="ss" assembly="SubSonic" namespace="SubSonic"/>

 </controls>

...
---

Em seguida selecione a página Default.aspx onde deseja usar o recurso e declara o controle Scaffolding conforme abaixo:

Executando o web site veremos a página apresentando as categorias cadastradas e as opções para incluir, alterar e excluir dados conforme mostram as figuras a seguir:

Depois dessa apresentação creio que não há mais nada a falar sobre essa ferramenta. Pretendo em um outro artigo abordar os recursos para incluir , alterar e excluir usando as classes da camada de acesso a dados.

Eu sei é apenas  .NET mas eu gosto...

Referências:


José Carlos Macoratti