Neste artigo vamos continuar o nosso exemplo anterior, criando a camada de negócios (BLL – Business Logic Layer).
O repositório é utilizado entre a camada DAL e a camada de negócios (BLL) em uma arquitetura em camadas. A camada de negócios é usada para se comunicar com o banco de dados através do Entity Data Model na camada de acesso a dados. Assim, quando a camada de apresentação requisitar ou enviar dados, ela se comunica com a camada de negócios sem se importar como os dados são mantidos ou persistidos.
A responsabilidade da camada de negócios é fornecer métodos para o cliente usar na apresentação e persistência das informações. Então, vamos arregaçar as mangas e partir para o trabalho!
Para atender as requisições da camada de apresentação, temos que nos lembrar quais objetivos a nossa aplicação vai cumprir e quais funcionalidades ela vai possuir. Ela deverá manter empregados e departamentos realizando as operações CRUD – incluindo, alterando, excluindo e consultando dados. Para isso, vamos criar um cadastro de empregados, de departamentos e um módulo de consulta onde iremos exibir os empregados por departamento.
No primeiro artigo, nós geramos o nosso Entity Data Model, onde obtivemos as entidades Departamento e Empregado.
Dessa forma, como já temos o nosso repositório criado, vamos definir na camada DAL as interfaces para representar os repositórios específicos para as entidades Empregado e Departamento.
Então selecione o projeto DAL e no menu PROJECT clique em Add New Item. Selecione o template Interface, informe o nome IEmpregadoRepositorio.cs e clique no botão Add. Em seguida, defina o código a seguir para a interface IEmpregadoRepositorio:
using Model; namespace DAL { public interface IEmpregadoRepositorio : IRepositorio<Empregado> { } }
Repita o procedimento anterior e crie a interface IDepartamentoRepositorio.cs com o código mostrado abaixo:
using Model; namespace DAL { public interface IDepartamentoRepositorio : IRepositorio<Departamento> { } }
Deveremos criar também as classes que implementam as interfaces IEmpregadoRepositorio e IDepartamentoRepositorio na camada DAL.
Então, selecione o projeto DAL e no menu PROJECT clique em Add New Item. Selecione o template Class, informe o nome EmpregadoRepositorio.cs e clique no botão Add. A seguir, defina o código a seguir para a classe EmpregadoRepositorio:
using Model; namespace DAL { public class EmpregadoRepositorio : Repositorio<Empregado>, IEmpregadoRepositorio { } }
Repita o procedimento anterior e crie a classe DepartamentoRepositorio.cs com o código mostrado abaixo:
using Model; namespace DAL { public interface DepartamentoRepositorio : Repositorio<Departamento>, IDepartamentoRepositorio { } }
Observe que não precisamos definir nenhum código nas interfaces e classes acima, pois estamos usando o mecanismo da herança e da implementação da interface e assim estamos usando os métodos definidos na interface IRepositorio e na classe Repositorio. Note também que estamos usando as entidades que foram separadas no projeto Model.
Neste momento, nossa solução tem a seguinte estrutura:
Vemos dois projetos: DAL e Model. Agora, sim, vamos incluir um novo projeto na solução que será a nossa camada de acesso a dados.
No menu FILE, clique em Add -> New Project.
A seguir, selecione o template Class Library e informe o nome BLL e clique no botão OK.
Remova o arquivo Class1 criado por padrão no projeto. Antes de prosseguir, vamos incluir referências aos projetos DAL e Model no projeto BLL.
Selecione o projeto BLL e no menu PROJECT clique em Add Reference.
A seguir, clique na guia Solution e marque as opções DAL e Model e clique no botão OK.
Agora vamos definir duas classes na camada BLL que irão implementar os métodos para atender as requisições da camada de apresentação relacionadas às entidadesEmpregado e Departamento.
Selecione o projeto BLL e no menu PROJECT clique em Add Class. Depois informe o nome EmpregadoBLL e clique no botão Add. A seguir, inclua o código abaixo na classe EmpregadoBLL:
using System.Collections.Generic; using System.Linq; using Model; using DAL; namespace BLL { public class EmpregadoBLL { IEmpregadoRepositorio _empregadoRepositorio; public EmpregadoBLL() { //cria uma instância do repositorio Empregado _empregadoRepositorio = new EmpregadoRepositorio(); } public List<Empregado> GetEmpregadosPorDepartamento(int departamentoId) { return _empregadoRepositorio.Get(e => e.DepartamentoId == departamentoId).ToList(); } public List<Empregado> Get_EmpregadoInfo(int ID = -1) { if (ID == -1) { //retorna todos os Empregados return _empregadoRepositorio.GetTodos().ToList(); } else { //retorna um determinado Empregado pelo seu ID return _empregadoRepositorio.Get(p => p.EmpregadoId == ID).ToList(); } } public void AdicionarEmpregado(Empregado emp) { _empregadoRepositorio.Adicionar(emp); _empregadoRepositorio.Commit(); } public Empregado Localizar(int id) { return _empregadoRepositorio.Find(id); } public void ExcluirEmpregado(Empregado emp) { _empregadoRepositorio.Deletar(c => c == emp); _empregadoRepositorio.Commit(); } public void AlterarEmpregado(Empregado emp) { _empregadoRepositorio.Atualizar(emp); _empregadoRepositorio.Commit(); } } }
Na classe EmpregadoBLL, implementamos métodos para realizar as operações CRUD e selecionar dados usando o Repositorio criado na camada DAL. Eu não implementei um tratamento de exceção nesta classe, farei isso na classe DepartamentoBLL para mostrar como fazer e aí você implementa,ok?!
Vamos repetir o procedimento acima e criar a classe DepartamentoBLL e definir os métodos relacionados com a entidade Departamento.
Selecione o projeto BLL e no menu PROJECT clique em Add Class. Depois informe o nome DepartamentoBLL e clique no botão Add. A seguir, inclua o código abaixo na classe DepartamentoBLL:
using System.Collections.Generic; using System.Linq; using Model; using DAL; using System; namespace BLL { public class DepartamentoBLL { IDepartamentoRepositorio _departamentoRepositorio; public DepartamentoBLL() { try { //cria uma instância do repositorio departamento _departamentoRepositorio = new DepartamentoRepositorio(); } catch (Exception ex) { throw ex; } } public List<Departamento> Get_DepartamentoInfo(int ID = -1) { try { if (ID == -1) { //retorna todos os departamentos return _departamentoRepositorio.GetTodos().ToList(); } else { //retorna um determinado departamento pelo seu ID return _departamentoRepositorio.Get(p => p.DepartamentoId == ID).ToList(); } } catch (Exception ex) { throw ex; } } public void AdicionarDepartamento(Departamento dep) { try { _departamentoRepositorio.Adicionar(dep); _departamentoRepositorio.Commit(); } catch (Exception ex) { throw ex; } } public Departamento Localizar(int id) { try { return _departamentoRepositorio.Find(id); } catch (Exception ex) { throw ex; } } public void ExcluirDepartamento(Departamento dep) { try { _departamentoRepositorio.Deletar(c => c == dep); _departamentoRepositorio.Commit(); } catch (Exception ex) { throw ex; } } public void AlterarDepartamento(Departamento dep) { try { _departamentoRepositorio.Atualizar(dep); _departamentoRepositorio.Commit(); } catch (Exception ex) { throw ex; } } } }
Dessa forma já temos nossa camada de negócios (BLL) pronta para atender as requisições da camada de apresentação.
Na próxima parte do artigo vamos definir a nossa camada de apresentação.