.NET - Apresentando o Subsonic - I (Gerando a sua Camada de acesso a dados)


Se você pretende desenvolver uma aplicação comercial usando a plataforma .NET nos dias atuais é quase certeza que vai ter que usar um banco de dados relacional. Além disso se você pretende que a sua aplicação seja fácil de manter e de migrar com certeza vai ter que trabalhar com no mínimo 3 camadas em sua aplicação.

Separar o seu trabalho em camadas facilita a organização do seu trabalho, a sua vida e a de que vai manter a aplicação. Então o básico será criar uma camada de apresentação, uma camada de negócio e uma camada de acesso a dados.

Esse assunto tem sido muito discutido e hoje em dia a maioria dos desenvolvedores sabem que têm que trabalhar dessa forma para ter produtividade, manutenabilidade, escalabilidade, etc.

Então por que muitos continuam fazendo o seu trabalho usando métodos improdutivos e não adotam o modelo em camadas ?

Simplesmente porque dá trabalho.

Você tem que planejar, tem que que gerar o script para gerar as tabelas, gerar a massa de teste, gerar as classes para a camada de acesso a dados, e, dependendo do tamanho do seu projeto, isso pode ser realmente uma tarefa muito tediosa.

Se essa for a desculpa que você usava você vai ter que mudar de atitude ou arrumar outra desculpa. Sabe porquê ?

E se eu dissesse que é possível realizar o trabalho de geração da camada de acesso a dados e dos scripts de suas tabelas sem fazer muito esforço ?

E se eu dissesse que existe uma ferramenta que faz tudo isso para você, é fácil de configurar, e, é grátis ?

Você acreditaria ???

Pois pode acreditar essa ferramenta existe e eu vou apresentá-la neste artigo.

Apresentando o Subsonic

Pois este artigo vai apresenta essa ferramenta e ela se chama Subsonic e pode ser obtida em : http://subsonicproject.com/ (clique em Download) ou http://www.codeplex.com/subsonic;

Nota: Quando eu escrevia este artigo a opção Download do site http://subsonicproject.com/ trazia o projeto completo com os fontes. Neste caso não há um instalador e você vai ter que descompactar o projeto em uma pasta (eu descompactei em Arquivos de Programas/Subsonic) , abrir o projeto e realizar um Build para poder gerar o arquivo sonic.exe e os arquivos .dll que irão ser referenciados no seu projeto.  O arquivo sonic.exe esta na pasta SubCommander\bin\Debug. 

O segundo link http://www.codeplex.com/subsonic não estava disponível.

O Subsonic é um projeto opensource que foi criado por Rob Conery e um grupo de desenvolvedores e tem o seu código fonte disponível no site http://subsonicproject.com/ (clique em Source e siga as instruções).

A versão atual disponível é 2.1 e como eu já disse seu principal objetivo é gerar as classes para a camada de acesso a dados dando atualmente suporte para os banco de dados SQL Server 2000/2005 (incluindo a versão Express), Oracle, MySQL e SQLite.

Nota: O Subsonic não da suporte ao banco de dados Microsoft Access.

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.

Configurando o Subsonic

Toda a informação que você encontra nesta página foi obtida no site http://subsonicproject.com/ onde você pode encontrar também vídeos para ajudá-lo se houver alguma dúvida.

Basicamente você só precisa efetuar 3 procedimentos para poder usar o Subsonic:

  1. Prepara o arquivo de configuração para usar o Subsonic;
  2. Incluir uma referência ao Subsonic no seu projeto; (Add Reference -> Browse)
  3. Executar o Subsonic usando o arquivo de linha de comando para gerar as classes; (O Subsonic usa um arquivo chamado subsonic.exe para gerar as classes)

á deu para perceber que a geração das classes é feita a partir do seu banco de dados, então ele deve ser primeiro item que deve estar providenciado. Lembrando que como outras ferramentas OR/M e de geração de código as suas tabelas devem estar normalizadas e todas (eu disse todas) definidas com uma Chave primária.

Eu estarei usando o Visual Web Developer 2008 Express para gerar o exemplo deste artigo mas podemos usar o Visual Studio 2008 ou até o VB 2008 Express.

1- Ajustando o seu ambiente para usar o SubSonic

A primeira coisa a fazer para poder usar o Subsonic é ajustar o arquivo de configuração da sua aplicação (Web.config ou App.Config). Fazemos isso incluindo as seguintes seções :

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

<configSections>

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

</configSections>

b- 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>

c- Definir o provedor usado pelo Subsonic

<SubSonicService defaultProvider="Northwind">

    <providers>

      <clear/>

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

    </providers>

  </SubSonicService>

 

Abaixo segue um exemplo para um arquivo App.config usado por uma aplicação VB .NET:

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

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

</configSections>

<connectionStrings>

<clear />

<add name="Pubs" connectionString="Data Source=MAC\SQLEXPRESS;Initial Catalog=pubs;Integrated Security=True"/>

</connectionStrings>

<SubSonicService defaultProvider="Pubs">

<providers>

<clear/>

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

</providers>

</SubSonicService>

</configuration>

 

Feitas as configurações acima ao executar a linha de comando do Subsonic serão geradas os arquivos das classes em uma pasta definida no seu projeto e você terá acesso aos arquivos podendo inclusive alterá-los, embora isso não seja recomendável pois a cada nova execução da ferramenta os arquivos serão gerados novamente sobrepondo os arquivos anteriores. Se você realmente precisar fazer alterações nas classes geradas você pode estendê-las usando o recurso das Partial Classes visto que todas as classes geradas são do tipo partial.

Existe ainda uma opção de configuração que pode ser usada para gerar as classes da sua camada de acesso a dados 'por trás dos panos' ficando dessa forma ocultas no seu projeto, nesta opção você não terá acesso aos arquivos. Para usar este recurso você tem que declarar um BuildProvider.

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>  

Eu não vou usar este recurso no exemplo do artigo.

Com isso o ambiente da sua aplicação já esta preparado para usar o Subsonic e gerar as classes para a sua camada de dados com base no banco de dados usado pela sua aplicação.

2- Referenciando o Subsonic no seu projeto

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;

3- 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 lingaugem 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 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:

Recursos do Subsonic

Além de facilitar a sua vida gerando as classes para você  o SubSonic traz também alguns controles muito interessantes , veja um resumo de cada um deles :

O recurso Scaffolding

Vou dar detalhes de um dos recursos muito interessantes do Subsonic é o componente 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. Abaixo a direita temos a declaração genérica e a esquerda uma aplicação para a tabela Categories. Neste caso será criada uma estrutura para as operações CRUD nesta tabela para a página web em questão:

  1. <ss:Scaffold ID="Identificação"    
  2.                    runat="server"    
  3.                    TableName="nomedaTable" />

 

  1. <ss:Scaffold ID="ProductsScaffold"    
  2.                    runat="server"    
  3.                    TableName="Categories" />

O resultado obtido será a seguinte página:

Para ativar o controle acima lembre-se de incluir no arquivo web.config a 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>

...
---

Com isso já sabemos como proceder para usar esta ferramenta fantástica que pode nos ajudar muito no trabalho do dia a dia. Existem mais recursos que não foram mencionados neste artigo. Para mais detalhes visite o site oficial : http://subsonicproject.com/

A seguir veremos um exemplo completo de uma aplicação web usando os principais recursos do Subsonic anunciados neste artigo.

Aguarde a continuação deste artigo em : .NET - Usando o Subsonic - II

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

Referências:


José Carlos Macoratti