Dev (Back & Front)ARTIGO

ASP .NET – Acessando PostGreSQL em camadas e com padrões de projeto – Parte 02

Na primeira parte deste artigo, vimos como criar uma aplicação em
camadas com camada de negócios, interface e camada de acesso a dados para acessar
um banco de dados PostgreSQL usando as boas práticas.

Nesta segunda parte, vamos definir as classes da
camada de negócios através das quais iremos acessar a camada de acesso a dados – DAL, criada na primeira parte do artigo.

Lembrando que a camada de negócios já foi criada
como um projeto do tipo Class Library e que tem como referência o projeto
CamdaAcessoDados e o projeto Entidades conforme exibe a figura
abaixo obtida no Project Dependencies:

Na verdade, em vez de criar as camadas como projetos, eu poderia ter criado
uma hierarquia de pastas na solução e ter realizado uma separação lógica entre
as camadas; a vantagem de criar um projeto é que podemos distribuir a dll dele para referenciar outros projetos. Mas essa decisão depende da
complexidade do projeto que estamos tratando.

A camada de negócios geralmente contém as regras do negócio e as validações
das solicitações antes de serem repassadas para a camada de acesso a dados.
Quando eu digo regra de negócio, eu me refiro a regras específicas, pertinentes à
sua aplicação, como um cálculo complexo ou uma rotina que realiza uma operação que
só o seu negócio tem e que o diferencia dos demais, além, é claro das regras
gerais pertinentes a qualquer negócio como cálculo de impostos, alíquotas, etc.

Como nossa aplicação é muito incipiente e no momento o objetivo é apenas
acessar os dados de uma tabela do banco de dados e exibi-los em uma página
ASP .NET, não teremos que nos preocupar com regras de negócio, apenas vamos
criar a estrutura que poderá ser usada para atingir o nosso objetivo e, no futuro,
implementar tais regras quando elas se fizerem necessárias.

Aqui eu vou mostrar na figura abaixo (que eu adaptei de uma figura
encontrada) um esquema do que seria a arquitetura da nossa solução:

Nessa figura, eu estou exibindo a
arquitetura da nossa solução e detalhando a camada de negócios onde temos:

  • A classe FactoryDAO.cs que usa o padrão Factory e serve para
    criar instâncias das classes;
  • A classe Facade.cs que usa o padrão Facade e permite agrupar em
    uma única classe as chamadas aos métodos que iremos usar;
  • A classe AlunoFacade.cs onde efetivamente chamamos os métodos
    que vamos usar para acessar a camada de acesso a dados.

Obs: Tanto a classe Facade.cs como AlunoFacade.cs são
implementadas usando a palavra-chave partial, de forma que temos arquivos
distintos mas que na verdade constituem um único arquivo.

Vejamos então o código de cada uma dessas classes.

O arquivo FactoryDAO.cs:

using System;<br /><br />using System.Collections.Generic;<br /><br />using System.Linq;<br /><br />using System.Text;<br /><br />using Macoratti.DAL;<br /><br />namespace Macoratti.BLL<br /><br />{<br /><br />  public static class FactoryDAO<br /><br />  {<br /><br />      public static AlunoDAL CreateAlunoDAL()<br /><br />      {<br /><br />          return new AlunoDAL();<br /><br />      }<br /><br />  }<br /><br />}

O padrão Factory fornece uma interface para a
criação de famílias de objetos correlatos ou dependentes sem a necessidade de
especificar a classe concreta desses objetos.

A classe FactoryDAO, como o nome sugere, é uma fabrica de instâncias
para as classes concretas da camada de acesso a dados. No momento, temos somente
a classe AlunoDAL(), mas poderíamos ter muitas outras classes.

O arquivo Facade.cs:

using System;<br /><br />using System.Collections.Generic;<br /><br />using System.Linq;<br /><br />using System.Text;<br /><br />using Macoratti.DAL;<br /><br />namespace Macoratti.BLL<br /><br />{<br /><br /> public partial class Facade<br /><br /> {<br /><br />     private AlunoDAL _alunoDAL;<br /><br />     public Facade()<br /><br />     {<br /><br />         _alunoDAL = FactoryDAO.CreateAlunoDAL();<br /><br />     } <br /><br /> }<br /><br />}

A classe Facade usa o padrão do mesmo nome para agrupar as chamadas
que serão feitas a camada de acesso a dados via camada de negócios.

Em padrões
de projeto, um façade (fachada, em francês) é um objeto que
disponibiliza uma interface para uma grande quantidade de funcionalidades de
uma API, por exemplo. Um façade pode:

  • tornar uma biblioteca de software mais fácil de
    entender e de usar;
  • tornar o código que utiliza essa biblioteca mais fácil
    de entender;
  • reduzir as dependências em relação às características
    internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do
    sistema;
  • envolver uma interface mal desenhada, com uma interface
    melhor definida.

O arquivo AlunoFacade.cs:

using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Text;<br />using Macoratti.DAL;<br />using Macoratti.Entidades;<br />namespace Macoratti.BLL<br /> {<br />  public partial class Facade<br />  {<br />   public void InserirAluno(Aluno aluno)<br />         {<br />           this._alunoDAL.Insert(aluno);<br />        }<br /><br />        public void UpdateAluno(int id, Aluno aluno)<br />        {<br />            this._alunoDAL.Update<int>(id, aluno);<br />        }<br />        public Aluno GetAluno(int id)<br />        {<br />            return this._alunoDAL.Get<int>(id);<br />        }<br />        public List<Aluno> GetTopAluno()<br />        {<br />            return this._alunoDAL.GetTop();<br />        }<br />       public void DeleteAluno(int id)<br />       {<br />           this._alunoDAL.Delete<int>(id);<br />       }<br />    }<br />}

Usando o conceito de partial class, você
pode dividir a definição de sua classe em mais de um arquivo físico.

O arquivo AlunoFacade.cs na verdade representa a mesma classe
Facade. A separação é possível pelo uso da palavra-chave partial.
Embora tenhamos definidos os métodos para inserir, atualizar, excluir e obter um
aluno, somente o método GetTopAluno() será usado para obter as informações
da tabela alunos a partir do método GetTop() da camada de acesso a dados.

Agora já temos tudo pronto, só falta definir a camada de interface…

Criando a camada de interface

A camada de interface com o usuário será uma aplicação ASP .NET e estará no
projeto EscolaWeb representado pelo arquivo Default.aspx.

Abra o arquivo Default.aspx e inclua um controle GridView. A
seguir, defina o seguinte código no code-behind Default.aspx.cs:

using System;<br /><br />using System.Collections.Generic;<br /><br />using System.Linq;<br /><br />using System.Web;<br /><br />using System.Web.UI;<br /><br />using System.Web.UI.WebControls;<br /><br />using Macoratti.BLL;<br /><br />using Macoratti.Entidades;<br /><br />namespace Escolaweb<br /><br />{<br /><br />    public partial class _Default : System.Web.UI.Page<br /><br />    {<br /><br />        //cria a instância da classe Facade <br /><br />        Facade _alunoFacade = new Facade();<br /><br />        protected void Page_Load(object sender, EventArgs e)<br /><br />        {<br /><br />            //usa o método GetTopAluno() da camada de negócios para acessar a tabela alunos<br /><br />            //e retornar as informações como uma lista de objetos <br /><br />            //exibindo-os no GridView<br /><br />            GridView1.DataSource = _alunoFacade.GetTopAluno().ToList();<br /><br />            GridView1.DataBind();<br /><br />        }<br /><br />    }<br /><br />}

No código acima, criamos uma instância da classe Facade e em seguida, no
evento Load da página web, chamamos o método GetTopAluno(), definido
na camada de negócios; esse método, por sua vez, chama o método GetTop() da
camada de acesso a dados, que retorna uma lista de objetos alunos.

Abaixo temos um esquema que mostra a hierarquia de chamadas realizadas entre
as camadas:

Antes de executar o projeto, não se esqueça de definir o projeto EscolaWeb como Set As Startup
Project e a página Default.aspx como Set As Startup Page.

Feito isso, basta rodar a solução que iremos obter o seguinte resultado:

Pegue o projeto completo aqui:
EscolawebPostgreSQL.zip

Eu sei, é apenas ASP .NET com boas práticas
e padrões de projeto,
mas eu gosto…

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil