ASP.NET MVC usando ADO.NET y las 3 Capas

En esta entrada veremos como usar ASP.NET MVC sin el Entity Framework.

autor Rodríguez Patiño, Eduardo
publicado
visitas 47,499

Queridos programadores por ahí surgio la duda de como programar en MVC usando mi antigua lógica, pues les paso un proyecto muy simple donde enseño a programar usando las 3 capas.

El proyecto consiste en un simple CRUD de una tabla Usuarios.

Para mi proyecto le he puesto a las capas los siguientes nombres

  • DAL, se encarga de realizar las consultas a la base de datos, la cual debe hacer una referencia a la capa ET

  • BL, se encarga de realizar la lógica de negocio, comunica la entidad con la capa de dato, referencia a la capa ET y DAL

  • ET, nuestras entidades que vienen a presentar nuestas tablas

  • Web, sera nuestro proyecto MVC, referencia a BL Y ET

Image title

Entonces creamos nuestras clases dentro de cada capa como hacemos siempre.

Entidad (ET)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ET
{
    public class Usuario
    {
        public int id { get; set;}
        public string Nombre{ get; set; }
        public string Apellido { get; set; }
        public int Rol_id { get; set; }

        public Rol Rol { get; set; }

        public Usuario() 
        {
            Rol = new Rol();
        }
    }
}

Logica de negocio (BL)

using DAL;
using ET;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BL
{
    public class UsuarioBL
    {
        private UsuarioDAL usuarioDAL = new UsuarioDAL();

        public List<Usuario> Listar()
        {
            return usuarioDAL.Listar();
        }
        public Usuario Obtener(int id)
        {
            return usuarioDAL.Obtener(id);
        }

        public bool Actualizar(Usuario usuario)
        {
            return usuarioDAL.Actualizar(usuario);
        }

        public bool Registrar(Usuario usuario)
        {
            return usuarioDAL.Registrar(usuario);
        }

        public bool Eliminar(int id)
        {
            return usuarioDAL.Eliminar(id);
        }
    }
}

Acceso a datos (DAL)

using ET;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Configuration;

namespace DAL
{
    public class UsuarioDAL
    {
        public List<Usuario> Listar() 
        {
            var usuarios = new List<Usuario>();

            try
            {
                using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["Colegio"].ToString())) 
                {
                    con.Open();

                    var query = new SqlCommand("SELECT * FROM usuario", con);
                    using (var dr = query.ExecuteReader()) 
                    {
                        while (dr.Read()) 
                        {
                            // Usuario
                            var usuario =  new Usuario { 
                                id = Convert.ToInt32(dr["id"]),
                                Nombre = dr["Nombre"].ToString(),
                                Apellido = dr["Apellido"].ToString(),
                                Rol_id = Convert.ToInt32(dr["Rol_id"]),
                            };

                            // Agregamos el usuario a la lista genreica
                            usuarios.Add(usuario);
                        }
                    }

                    // Agregamos el ROL
                    foreach (var u in usuarios) 
                    {
                        query = new SqlCommand("SELECT * FROM rol WHERE id = @id", con);
                        query.Parameters.AddWithValue("@id", u.Rol_id);

                        using (var dr = query.ExecuteReader())
                        {
                            dr.Read();
                            if (dr.HasRows)
                            {
                                u.Rol.id = Convert.ToInt32(dr["id"]);
                                u.Rol.Nombre = dr["Nombre"].ToString();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return usuarios;
        }

        public Usuario Obtener(int id)
        {
            var usuario = new Usuario();

            try
            {
                using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["Colegio"].ToString()))
                {
                    con.Open();

                    var query = new SqlCommand("SELECT * FROM usuario WHERE id = @id", con);
                    query.Parameters.AddWithValue("@id", id);

                    using (var dr = query.ExecuteReader())
                    {
                        dr.Read();
                        if (dr.HasRows) {
                            usuario.id = Convert.ToInt32(dr["id"]);
                            usuario.Nombre = dr["Nombre"].ToString();
                            usuario.Apellido = dr["Apellido"].ToString();
                            usuario.Rol_id = Convert.ToInt32(dr["Rol_id"]);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return usuario;
        }

        public bool Actualizar(Usuario usuario)
        {
            bool respuesta = false;

            try
            {
                using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["Colegio"].ToString()))
                {
                    con.Open();

                    var query = new SqlCommand("UPDATE Usuario SET Nombre = @p0, Apellido = @p1, Rol_id = @p2 WHERE id = @p3", con);

                    query.Parameters.AddWithValue("@p0", usuario.Nombre);
                    query.Parameters.AddWithValue("@p1", usuario.Apellido);
                    query.Parameters.AddWithValue("@p2", usuario.Rol_id);
                    query.Parameters.AddWithValue("@p3", usuario.id);

                    query.ExecuteNonQuery();

                    respuesta = true;
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return respuesta;
        }

        public bool Registrar(Usuario usuario)
        {
            bool respuesta = false;

            try
            {
                using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["Colegio"].ToString()))
                {
                    con.Open();

                    var query = new SqlCommand("INSERT INTO Usuario(Nombre, Apellido, Rol_id) VALUES (@p0, @p1, @p2)", con);

                    query.Parameters.AddWithValue("@p0", usuario.Nombre);
                    query.Parameters.AddWithValue("@p1", usuario.Apellido);
                    query.Parameters.AddWithValue("@p2", usuario.Rol_id);

                    query.ExecuteNonQuery();

                    respuesta = true;
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return respuesta;
        }

        public bool Eliminar(int id)
        {
            bool respuesta = false;

            try
            {
                using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["Colegio"].ToString()))
                {
                    con.Open();

                    var query = new SqlCommand("DELETE FROM usuario WHERE id = @p0", con);
                    query.Parameters.AddWithValue("@p0", id);
                    query.ExecuteNonQuery();

                    respuesta = true;
                }
            }
            catch (Exception ex)
            {
                throw;
            }

            return respuesta;
        }
    }
}

Y así tenemos la lógica que nos enseñaron en clase.

¿Nuestro controlador como lo tenemos?

using BL;
using ET;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Web.Controllers
{
    public class DefaultController : Controller
    {
        private UsuarioBL usuarioBL = new UsuarioBL();
        private RolBL rolBL = new RolBL();

        public ActionResult Index()
        {
            return View(usuarioBL.Listar());
        }

        public ActionResult Editar(int id = 0) 
        {
            ViewBag.Roles = rolBL.Listar();
            return View(id == 0 ? new Usuario() : usuarioBL.Obtener(id));
        }

        public ActionResult Guardar(Usuario usuario)
        {
            var r = usuario.id > 0 ? 
                    usuarioBL.Actualizar(usuario) : 
                    usuarioBL.Registrar(usuario);

            if (!r) 
            {
                // Podemos validar para mostrar un mensaje personalizado, por ahora el aplicativo se caera por el throw que hay en nuestra capa DAL
                ViewBag.Mensaje = "Ocurrio un error inesperado";
                return View("~/Views/Shared/_Mensajes.cshtml");
            }

            return Redirect("~/");
        }

        public ActionResult Eliminar(int id)
        {
            var r = usuarioBL.Eliminar(id);

            if (!r)
            {
                // Podemos validar para mostrar un mensaje personalizado, por ahora el aplicativo se caera por el throw que hay en nuestra capa DAL
                ViewBag.Mensaje = "Ocurrio un error inesperado";
                return View("~/Views/Shared/_Mensajes.cshtml");
            }

            return Redirect("~/");
        }
    }
}

Espero que te haya servido el material, con esto le has dado una vista global al proyecto y seguro te servira por si quieres seguir trabajando con ADO.NET puro.

De todas formas bajate el proyecto para que entiendas el material explicado en esta entrada.

- Nuestros cursos -

Curso de Node JS desde cero
Curso de GIT desde cero
Curso de October CMS
Curso de API RESTFul con Lumen
Curso de Patrones de diseño con TypeScript
Curso de especialidad en JavaScript