Tips de Desarrollo Web

Escrito por Juan David Nicholls

NAVEGACIÓN

Arquitectura N-Capas y LinqToSQL

La arquitectura de N-Capas es un estilo más que existe en la programación, es importante en muchos aspectos principalmente porque nos permite en nuestros desarrollos separar la lógica de Acceso a Datos (Capa de Datos) de la lógica del Negocio (Capa de Negocio) y a su vez de la lógica de Diseño (Capa de Presentación). En definitiva estamos creando un sistema modular (Cada capa solicita un servicio de la capa inferior) que es mucho más legible y manejable, en donde cualquier capa puede ser modificada o reemplazada y el sistema debe seguir funcionando normalmente. Todo esto tiene su origen del refrán “Divide y Vencerás” en donde logramos encontrar una solución optima a un problema complejo dividiendo este en partes más simples.

Untitled

LinqToSQL proporciona una infraestructura para la gestión de datos relacionales como objetos sin perder la capacidad de consulta a la base de datos. Este es independiente del idioma, es decir cualquier lenguaje (VB o C#) construido para proporcionar LINQ se puede utilizar para permitir el acceso a la información almacenada en bases de datos relacionales. Todo esto quiere decir que podemos arrastrar literalmente todas nuestras tablas, vistas y procedimientos de nuestra base de datos SQL y manipularlas como entidades, las cuales conservan las relaciones de la base de datos mediante la POO de manera automática.

  • Desarrollando una Aplicación Web de 3 Capas con LinqToSQL

En Visual Studio, damos Click en Archivo, Nuevo, Sitio Web. Seleccionamos el .NET Framework, el lenguaje de Programación VB o C# (En mis ejemplos siempre será C#), Sitio Web ASP.NET vacío  y seleccionamos la ubicación.

Crear un Sitio Web ASP.NET

Esto creará una solución y un proyecto (Capa de Presentación). Agregaremos nuestra capa de Datos mediante el Explorador de la solución, Click derecho sobre la solución, Añadir, Nuevo Proyecto.

Crear un Nuevo Proyecto

Posteriormente seleccionamos el lenguaje (Podemos observar que cada proyecto (capa en nuestro ejemplo) puede tener un lenguaje de programación distinto, esto se debe gracias a que al compilar nuestra solución cada proyecto se compila a CIL), el .NET Framework de nuestra capa de Acceso a datos, Biblioteca de clases.

Recuerda cambiar la ubicación a la carpeta de nuestra solución.

Crear una Biblioteca de Clases

Borramos la clase que se crea por defecto, ya que en nuestro ejemplo no es de utilidad

Borrando Clase

Click derecho sobre nuestro proyecto (Capa de acceso a datos), Agregar, Nuevo Item.

Agregando nuevo Item

Ahora agregaremos LINQ to SQL Classes, que será el encargado de crear las clases de entidad que estarán mapeadas a nuestras tablas y vistas.

Agregando LINQ to SQL Classes

Ahora nos conectamos a nuestra base de datos mediante el explorador de Servidores

Conexión a una Base de Datos

Seleccionamos las tablas, vistas y procedimientos almacenados que vayamos a emplear de nuestra base de datos y con el Click sostenido las arrastramos al diseñador

Arrastrando tablas, vistas y procedimientos a nuestro dbml

Aceptamos y automáticamente aparecerán las clases de entidad en nuestra vista de diseñador, incluyendo las relaciones existentes. En el espacio de la derecha, si hubiéramos arrastrado, se verían los procedimientos almacenados.

Vista diseñador de LinqToSQL 

Guardamos y ya tenemos nuestra Capa de Acceso a datos lista. En el archivo app.config que se crea automáticamente además del DataContext (Punto de entrada sobre la cual haremos CRUD a nuestra base de datos), podemos visualizar la cadena de conexión. Ahora agregaremos un nuevo proyecto para nuestra Capa de Negocio, agregando nuevamente una biblioteca de clases como anteriormente hicimos para la capa de Acceso a Datos.

Creando un Nuevo Proyecto

Cabe aclarar que una capa inferior no puede tener una versión de .NET Framework superior, es decir la capa de Acceso a datos por ejemplo no puede tener una versión superior de .NET Framework que la versión de la Capa de Negocio, pero la Capa de Negocio si puede tener una versión superior a la de Acceso a Datos.

Agregamos la referencia de la Capa de Acceso a Datos en nuestra Capa de Negocio

Agregando Referencia

Agregando referencia de nuestra Solución

Ahora le cambiaremos el nombre a nuestra Clase creada por defecto, en mi caso la llamare “Manager”, agregamos la referencia de nuestra Capa de Acceso a Datos (using Data;) y creamos una instancia de nuestro DataContext sobre el cual haremos CRUD a nuestra Base de Datos.

Manager.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Data;
  7.  
  8. namespace Core
  9. {
  10.     public class Manager
  11.     {
  12.         #region Data
  13.         private DataClassesDataContext model;
  14.         private DataClassesDataContext DataModel
  15.         {
  16.             get
  17.             {
  18.                 return model ?? (model = new DataClassesDataContext());
  19.             }
  20.             set
  21.             {
  22.                 model = value;
  23.             }
  24.         }
  25.         #endregion
  26.     }
  27. }

Ahora hare unos ejemplos de CRUD con LINQ, en mi caso me encanta emplear Expresiones Lambda para las consultas, por lo tanto agrego la referencia System.Data.Linq a la Capa de Negocio

Agregando System.Data.Linq

Seleccionando Registros

  1. #region Select
  2.  
  3. public IQueryable<User> GetUsers()
  4. {
  5.     return DataModel.Users;
  6. }
  7.  
  8. public IQueryable<User> GetUsersByName(string name)
  9. {
  10.     name = name.ToLower();
  11.     return DataModel.Users.Where(x=>x.FirstName.ToLower().Contains(name)
  12.                                     || x.LastName.ToLower().Contains(name));
  13. }
  14.  
  15. public User GetUser(Guid userId)
  16. {
  17.     return DataModel.Users.SingleOrDefault(x => x.UserId == userId);
  18. }
  19.  
  20. #endregion

Donde en el primer caso hacemos una consulta de todos los usuarios de nuestra Base de Datos. Como la tabla se llama Users podemos identificar que User es en si solo un registro de esa tabla.

En el segundo caso consultamos todos los usuarios que tengan en sus nombres o apellidos el valor de la variable name, sin importar si esta en mayúsculas o minúsculas, es el primer ejemplo de expresiones lambda y podemos ver lo sencillo que es.

En el tercer caso consultamos únicamente el usuario con ese userId, la diferencia entre Single y SingleOrDefault es que este ultimo retorna null si el usuario con ese id no existe en la base de datos.

Actualizando Registros

  1. #region Update
  2.  
  3. public void UpdateUserName(Guid userId, string newfirstname)
  4. {
  5.     User user = GetUser(userId);
  6.     user.FirstName = newfirstname;
  7.     DataModel.SubmitChanges();
  8. }
  9.  
  10. public void UpdateUsersName(string newfirstname)
  11. {
  12.     var users = GetUsers();
  13.     foreach (var user in users)
  14.     {
  15.         user.FirstName = newfirstname;
  16.     }
  17.     DataModel.SubmitChanges();
  18. }
  19.  
  20. #endregion

En los 2 casos consultamos primero a la Base de datos, luego al registro le asignamos el nuevo valor y por último confirmamos los cambios al DataContext.

Insertando un Registro

  1. #region Insert
  2.  
  3. public void InsetUser(string firstname, string lastname)
  4. {
  5.     DataModel.Users.InsertOnSubmit(new User()
  6.     {
  7.         FirstName = firstname,
  8.         LastName = lastname
  9.     });
  10.     DataModel.SubmitChanges();
  11. }
  12.  
  13. #endregion

Debes de crear un nuevo registro que cumpla con los campos requeridos en la Base de Datos, recuerda que si la columna del Id es identity, no le debes de dar ningún valor porque se asigna solo.

Eliminando un Registro

  1. #region Delete
  2.  
  3. public void DeleteUser(Guid userId)
  4. {
  5.     DataModel.Users.DeleteOnSubmit(GetUser(userId));
  6.     DataModel.SubmitChanges();
  7. }
  8.  
  9. #endregion

Ahora procedemos a agregar la referencia de nuestra Capa de Negocio a nuestra capa de Presentación, en este caso el Sitio Web.

Agregando Referencia

Y por lo tanto, ya podemos llamar nuestra lógica de negocio en nuestra Capa de Presentación.

Agregamos un nuevo WebForm

Agregando nuevo WebForm

Agregamos la referencia de nuestra Capa de Negocio, otra forma de hacerlo es copiar el nombre de la Clase y presionar Ctrl + . con esto nos aparecerá la posible referencia a agregar de la Clase.

Agregando Referencia mediante Ctrl + .

Y llamamos nuestra lógica de negocio

  1. using Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Web;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8.  
  9. public partial class _Default : System.Web.UI.Page
  10. {
  11.     protected void Page_Load(object sender, EventArgs e)
  12.     {
  13.         Manager manager = new Manager();
  14.         manager.InsetUser("Juan David", "Nicholls");
  15.     }
  16. }

Y así hemos terminado con éxito el ejercicio, hasta la próxima ;)

blog comments powered by Disqus