Artigo do tipo Tutorial
Recursos especiais neste artigo:
Artigo no estilo Mentoring
Cenário
Normalmente todo sistema corporativo é composto por entidades core, que são aquelas responsáveis pelos processos principais do negócio, como por exemplo, movimentação de estoque, pedido, vendas e entidades de certa forma mais cadastrais como departamento, classificação, tipo, dentre outras. O que acontece é que estas entidades cadastrais possuem um fluxo muito semelhante de manutenção de seus dados, porém muitas vezes não percebemos isso e acabamos criando código duplicado em diversos cadastros com diversas implementações concretas que poderiam ser abstraídas.


Em que situação o tema é útil
Este tema é útil a todos que trabalham com ASP.NET MVC e desejam aumentar o reuso e padronização de sua camada controller através da criação de uma abstração de comportamentos e fluxos comuns a diversos tipos de cadastros e formulários da aplicação.

Uma das principais características das aplicações orientadas a objetos é a possibilidade de abstração que pode ser feita através do uso de interfaces ou de hierarquia de classes. Esta abstração nos permite obter maior reuso de nosso código, evitando duplicidade e redundância, fazendo com que tenhamos mais produtividade e padronização nas nossas soluções.

Apesar disso, é muito comum vermos desenvolvedores desatentos às oportunidades de abstração em suas aplicações, o que resulta em redundância de código e desperdício de tempo.

Neste artigo nós veremos um típico cenário destes onde criaremos um exemplo simples que consistirá em um cadastro comum de duas entidades: Funcionario e Departamento. Este cadastro será feito em ASP.NET MVC 4 e vai demonstrar uma oportunidade de abstração na camada de controller, através do uso de Generics e técnicas de refatoração.

Para que possamos compreender todo o raciocínio da solução, vamos criar um exemplo da forma como é realizado na maioria das equipes de desenvolvimento, partindo-se de uma solução concreta.

Listagem 1. Classe de Departamento


  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;
  04 using System.Web;
  05
  06 namespace DevMedia.BaseController.Models
  07 {
  08     public class Departamento
  09     {
  10         public long Id { get; set; }
  11 
  12         public string Nome { get; set; }
  13     }
  14 } 

Listagem 2. Classe de Funcionario


  01 using System;
  02 using System.Collections.Generic;
  03 using System.Linq;
  04 using System.Web;
  05 
  06 namespace DevMedia.BaseController.Models
  07 {
  08     public class Funcionario
  09     {
  10         public long Id { get; set; }
  11 
  12         public string Nome { get; set; }
  13 
  14         public string Cargo { get; set; }
  15 
  16         public Departamento Departamento { get; set; }
  17     }
  18 } 

Nas Listagens 1 e 2 nós temos a definição das classes de nosso modelo, que usaremos para exemplificação da solução. São classes simples, apenas com estado, visto que nos limitaremos a criação e listagem destes dados em uma página web, sem entrar no mérito de comportamento e regras de negócio.

Uma vez definidas as classes do modelo, precisaremos de uma classe para realizar a persistência destes dados. Como o objetivo do artigo é criar uma abstração na camada controller, não trabalharemos com banco de dados, realizando apenas uma persistência fake, em memória, através de uma lista estática. Esta lista estática por sua vez, ficará em uma classe chamada repository, que visa abstrair o conceito de persistência e recuperação de dados para o domínio da aplicação. Com isso, nossa camada controller irá receber uma requisição da view, irá criar um repositório para o domínio em questão e invocará algum de seus métodos, sendo que neste caso teremos apenas os métodos necessários para nossa solução, sendo estes: Save, GetById e GetAll. Nas Listagens 3 e 4 nós temos a implementação dos repositórios de Funcionario e Departamento, onde podemos ver que as duas são bastante semelhantes. Vamos analisar o repositório de funcionário como referência: Na linha 11 nós temos uma propriedade estática que será responsável por armazenar todos os funcionários cadastrados no nosso sistema, onde definimos como sendo um Dictionary para facilitar a recuperação dos dados da mesma. Desta forma, teremos o ID do funcionário como sendo o key do dictionary e o próprio objeto como sendo o value.

...

Quer ler esse conteúdo completo? Tenha acesso completo