.NET

2 mai, 2016

O padrão repositório revisitado – Parte 03

Publicidade

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:

net_1

Note que a imagem Cadastro.png que eu usei está na pasta Imagens criada no projeto.

Executando o projeto, iremos obter o seguinte resultado:

net_2

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).