En el proyecto en el que estoy programando, hemos tomado de decisión de adoptar el patrón MVP, que es Modelo Vista y Presentador. Es algo muy parecido al MVC.
Para hacerse una idea de lo que es,
aquí alguna referencia.
Tiene muchas ventajas, ya que separa realmente en capas la aplicación.
Mejor esto que meter todo en la presentación, no?
Primeramente hay que hacer 4 proyectos. En este ejemplo concreto voy a emplear asp.net, pero perfectamente se puede emplear WindowsForms, Gtk#, ...
Detallo cada uno de los proyectos de los que consta la solución, para implementar la arquitectura MVP. Luego se puede modificar adaptando a las necesidades concretas de cada proyecto.
1º Vista, donde se encuentran los elementos visuales, en este caso .aspx
2º Presentadores, donde se encuentra la lógica del negocio
3º Modelos, donde está lo relacionado con los datos
4º Entidades, todo lo relacionado con las entidades de negocio y lo que viaja por las capas, pero hay que tener en cuenta de que son objetos no datatables, ni datasets.
Como se puede apreciar, la solución con los cuatro proyectos.
Me voy a centrar en un pequeño ejemplo, que es dar de alta un usuario. Comencemos pues ...
Añadimos un nuevo elemento el proyecto de vistas, que se va a llamar NuevoUsuario.aspx, que va a servir para dar de alta a los nuevos usuarios. El código de presentación es el siguiente.
<%@ Page Language="C#" Inherits="Vistas.NuevoUsuario" %>
NuevoUsuario
También se tiene que crear una interfaz, que se va a llamar IUsuarioVista, se encuentra el en proyecto de Presentadores. Define el comportamiento de la página NuevoUsuario.aspx. El código es el siguiente
using System;
namespace Presentadores
{
public interface IUsuarioVista
{
string Nombre { get; }
string PrimerApellido { get; }
string SegundoApellido { get; }
string DeportePreferido { get ; }
}
}
Como se puede observar las propiedades son cada una de las cajas de texto de la página. Esta es la forma de comunicación de datos entre la vista y el presentador.
Como se ve lógico hay una entidad, que se llama Usuario, se crea en el proyecto de Entidades, su código es:
using System;
namespace Entidades
{
public class Usuario
{
public string Nombre {
get;
set;
}
public string PrimerApellido {
set;
get;
}
public string SegundoApellido {
get;
set;
}
public string DeportePreferido {
get;
set;
}
public Usuario ()
{
Nombre = string.Empty;
PrimerApellido = string.Empty;
SegundoApellido = string.Empty;
DeportePreferido = string.Empty;
}
}
}
En el proyecto (capa) Modelos, creamos la clase correspondiente, para guardar, actializar, crear y eliminar un Usuario, dentro de la base de datos. El código dependerá de la base de datos con la que se trabaje, o sistema de almacenamiento correspondiente.
using System;
using Entidades;
namespace Modelos
{
public class UsuarioRepositorio
{
public UsuarioRepositorio ()
{
}
public void GuardarUsuario (Usuario usuario)
{
/*Guarda el nuevo usuario en la base de datos*/
}
public void EliminarUsuario (Usuario usuario)
{
/*Borrar el usuario en la base de datos*/
}
public void ActualizarUsuario (Usuario usuario)
{
/*Actualiza los valores del usuario en la base de datos*/
}
}
}
Ahora toca la lógica del negocio, es decir programar el código del presentador, relaciionado con dar de alta un nuevo usuario. Esta capa, se tiene que encargar de conseguir los datos introducidos y guardarlos en la base de datos. Para ello, por medio de la interfaz, se pueden conseguir los valores, se construye la entidad Usuario y luego se llama a la capa de datos, pasándole el nuevo usuario, para almacenarlo.
using System;
using Modelos;
using Entidades;
namespace Presentadores
{
public class UsuarioPresentador
{
private IUsuarioVista _vista;
private UsuarioRepositorio _modelo;
public UsuarioPresentador (IUsuarioVista vista)
{
_vista = vista;
_modelo = new Modelos.UsuarioRepositorio();
}
public void GuardarNuevoUsuario ()
{
var nuevoUsuario = new Usuario ()
{
Nombre = _vista.Nombre,
PrimerApellido = _vista.PrimerApellido,
SegundoApellido = _vista.SegundoApellido,
DeportePreferido = _vista.DeportePreferido
};
_modelo.GuardarUsuario(nuevoUsuario);
}
}
}
Como se puede apreciar el el código anterior. Colabora con la página porque en el contructor se la han pasado, y está en el objeto _vista. Hay que decir que la página tiene que implementar la interfaz IUsuarioVista. Luego el objeto que se encarga de guardar los datos, es _modelo.
Ahora el código codebehing de la página es:
using System;
using System.Web;
using System.Web.UI;
using Presentadores;
namespace Vistas
{
public partial class NuevoUsuario : System.Web.UI.Page, IUsuarioVista
{
private UsuarioPresentador _usuarioPresentador;
public NuevoUsuario ()
{
_usuarioPresentador = new UsuarioPresentador (this);
}
public string Nombre {
get { return txtNombre.Text; }
}
public string PrimerApellido {
get { return txtPrimerApellido.Text; }
}
public string SegundoApellido {
get { return txtSegundoApellido.Text; }
}
public string DeportePreferido {
get { return txtDeportePreferido.Text; }
}
protected void btnGuardar_click (object sender, EventArgs e)
{
_usuarioPresentador.GuardarNuevoUsuario ();
}
}
}
Como se puede apreciar, para crear en presentador, se pasa así mismo, porque implementa la interfaz IUsuarioVista. De esta forma colaboran la capa de presentación y la capa de las vistas.
Una forma de limpia y coherente de hacer las cosas, mejor que meter todo en la página y el siguiente que se apañe.