Neste artigo, vamos rever os conceitos relacionados ao padrão repositório com um exemplo prático em uma aplicação ASP .NET MVC 5 usando a linguagem C#.
Na segunda parte do artigo, implementamos a camada de negócios (BLL), definimos a string de conexão no arquivo web.Config e criamos o controlador UsuarioController usando o Scaffold, de forma a ter os métodos Actions e as views criadas automaticamente.
Vamos concluir o nosso projeto fazendo os ajustes no controlador UsuarioController, utilizando a nossa camada de negócios e o nosso repositório.
Recursos usados:
Ajustando o controlador para usar a camada de negócios e o repositório
Abra o projeto Mvc_Repositorio criado na versão do VS 2013 Express for web do artigo anterior.
Em seguida, abra o arquivo UsuarioController.cs da pasta Controllers.
Altere o código desse controlador conforme mostrado a seguir:
using System.Net; using System.Web.Mvc; using Mvc_Repositorio.Dominio.Entidades; using Mvc_Repositorio.Negocio; namespace Mvc_Repositorio.Controllers { public class UsuarioController : Controller { private UsuarioBLL _usuarioBll; public UsuarioController() { _usuarioBll = new UsuarioBLL(); } public ActionResult Index() { return View(_usuarioBll.Get_UsuarioInfo()); } // GET: Usuario/Details/5 public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Usuario usuario = _usuarioBll.Localizar(id);//db.Usuarios.Find(id); if (usuario == null) { return HttpNotFound(); } return View(usuario); } // GET: Usuario/Create public ActionResult Create() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "UsuarioId,Nome,Senha,Email")] Usuario usuario) { if (ModelState.IsValid) { _usuarioBll.AdicionarUsuario(usuario);//db.Usuarios.Add(usuario); //_usuarioBll.db.SaveChanges(); return RedirectToAction("Index"); } return View(usuario); } // GET: Usuario/Edit/5 public ActionResult Edit(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Usuario usuario = _usuarioBll.Localizar(id);//db.Usuarios.Find(id); if (usuario == null) { return HttpNotFound(); } return View(usuario); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([Bind(Include = "UsuarioId,Nome,Senha,Email")] Usuario usuario) { if (ModelState.IsValid) { _usuarioBll.AlterarUsuario(usuario); //db.Entry(usuario).State = EntityState.Modified; //db.SaveChanges(); return RedirectToAction("Index"); } return View(usuario); } // GET: Usuario/Delete/5 public ActionResult Delete(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Usuario usuario = _usuarioBll.Localizar(id);//db.Usuarios.Find(id); if (usuario == null) { return HttpNotFound(); } return View(usuario); } // POST: Usuario/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public ActionResult DeleteConfirmed(int id) { Usuario usuario = _usuarioBll.Localizar(id);//db.Usuarios.Find(id); _usuarioBll.ExcluirUsuario(usuario);//db.Usuarios.Remove(usuario); //db.SaveChanges(); return RedirectToAction("Index"); } } } }
No código acima, eu criei uma instância da nossa camada de negócio no construtor do controlador UsuarioController:
private UsuarioBLL _usuarioBll; public UsuarioController() { _usuarioBll = new UsuarioBLL(); }
Dessa forma, agora basta substituir o código que usava a instância do contexto pela instância da nossa camada de negócio.
O código em azul foi incluído e o código anterior foi comentado e colorido na cor verde.
Note que estamos usando a instância _usuarioBll para acessar os métodos da camada de negócio e que agora a implementação da camada de acesso a dados é transparente para nossa interface.
Feito isso, não precisamos alterar nenhuma view gerada pelo Scaffold (apenas fazer as traduções para o português, se você desejar).
Vou alterar o arquivo _Layout.cshtml da pasta \Views\Shared incluindo uma imagem em todas as views:
Note que a imagem Cadastro.png que eu usei está na pasta Imagens criada no projeto.
Executando o projeto, iremos obter o seguinte resultado:
Com isso, fizemos uma revisão de conceitos sobre o padrão repositório usando uma abordagem bem simples para mostrar a sua importância.
Em outro artigo, vou abordar a injeção de dependência que pode ser usada para desacoplar ainda mais os nossos projetos e que poderia ser aplicada a esse exemplo.
Pegue o projeto completo aqui: Mvc_Repositorio.zip (sem as referências).