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