Datapayasadas

julio 17, 2008

Aplicaciones en 3 capas

Filed under: C# — Etiquetas: , , , — pabloide86 @ 6:11 pm

Buenassssamigos…son varias las consultas que me han llegado sobre como realizar una aplicación utilizando la famosa arquitectura de 3 capas. Voy a intentar ser lo mas breve posible para que se entienda el concepto y luego les dejo un ejemplo con codigo fuente para descargar!

La separación en capas es mas un concepto lógico que físico. Se trata de dividir a un programa, o mejor dicho agrupar componentes que cumplen funciones similares para lograr que el código sea mas compacto , para eliminar problemas a la hora de introducir una modificación, para tener mas flexibilidad a la hora de cambiar las partes que componen un sistema, etc.

En la arquitectura de 3 capas generalmente nos encontramos con:

  • Capa de presentación: es la encargada de interactuar con el usuario
  • Capa de negocio: es la encargada de gestionar todas las reglas que rigen a nuestro sistema
  • Capa de acceso a datos: es la encargada de manejar la lógica de cómo se persisten los datos en algún tipo de almacenamiento

Éstas son solo 3 pero puede haber cuantas capas se necesiten. Algunos sistemas pueden tener solo 2 y otros pueden necesitar 7 o mas!

En sistemas diseñados con tecnología orientada a objetos además podemos encontrar con una capa de entidades que es la que contiene todos los objetos de nuestro negocio que se irán pasando de capa en capa.

Pero entonces…¿¡¿como funciona?!?

Es sencillo. En la capa de presentación solamente vamos a poner el código necesario para hacer funcionar la interfaz de usuario: como manejar controles, como llenar una grilla o un TextBox, como navegar por las diferentes pantallas, etc.

En la capa de negocios solamente vamos a poner el código necesario para que se cumplan nuestras reglas de negocios: campos requeridos, validación de valores, relaciones entre objetos, restricciones para eliminar o insertar, etc.

Y en la capa de acceso a datos solamente vamos a poner el código necesario para transformar nuestros objetos de negocio en una fila dentro de un archivo o una base de datos y viceversa.

Les prepare un ejemplo muy breve con código en C# para que se entienda mejor (eso espero!). Está bastante comentado el codigo asique no creo que vayan a tener problemas en interpretarlo.

http://cid-c589ef15c82d0cdf.skydrive.live.com/self.aspx/Public/DataPayasadas/TresCapas.rar

Deben descomprimir el archivo y abrir la solución con Visual Studio 2005. Luego ejecuten en modo Debug (F5) y cuando opriman los botones (insertar o refresh) o cuando cargue el formulario principal vayan haciendo el Paso a paso presionando F11.

La base de datos utilizada es SQLite, una base de datos gratuita de muy buen rendimiento! (cof cof juira Access cof cof)

Algunos links para profundizar sobre el tema:

http://www.microsoft.com/spanish/msdn/arquitectura/das/distapp.mspx

http://www.desarrollaconmsdn.com/msdn/

Bueno espero que les haya sido útil!

Saludos y hasta la próxima!

Anuncios

21 comentarios »

  1. hola ske tal llevo un año programando en .net y lo interesantes es ke nadie me enseño
    todo lo fui descubriendo en cada tropezon ke chidooo verdad jejej bueno lo ke fui descubriendo es ke es mejor i r separando nuestra aplicacion en diferentes instacias como lo mencionas y bueno si alguien me hubiera explicado estop me cae ke ya estuviera en otro nivel pero bueno me dagusto encontrar este tipo de articulos que apoyen a todos los novatos como yo..

    buen post +10

    Comentario por marco — noviembre 9, 2008 @ 3:57 am

  2. Muy buen ejemplo..
    Al igual que marco no uso las capas, articulos como este sin duda nos facilitan las cosas ya que poria dar mejor mantenimiento al Codigo…
    Gracias por el exelente aporte..

    +20

    Comentario por Luis — agosto 5, 2009 @ 12:39 am

  3. Esto es lo que tanto de nosotros los novatos de programación necesitábamos! Te mereces mis respetos y aplausos por tu apoyo

    Comentario por Edison — agosto 19, 2009 @ 5:19 pm

  4. muy bueno el ejemplo, tenia un consula, tengo una aplicacion que maneja clientes y equipos, donde cada equipo pertenece a un cliente y posee un estado disponible o no disponible(equipo), en la bd esta mapeada la relacion. En el codigo como se mapea esa relacion?, a la entidad equipo le agrego un atributo del tipo cliente? private Cliente cli y para y la propiedad “disponible” la tomo como una enumeracion? asi me trae el nombre del estado y no el codigo?
    lo que necesitaba hacer es que por cada cliente que le indico me traiga en un datagrid los datos de todos sus equipos. Mucha gracias por todo la verdad que el ejemplo me aclaro varias cosas

    Comentario por matias — septiembre 3, 2009 @ 6:15 pm

    • Hola matias! gracias por tu consulta! el tema de los mapeos es un tema bastante extenso… pero basicamente lo que podes hacer es en la clase Cliente poner una propiedad de tipo
      List<Equipo> Equipos { get; set;} de esta forma podes iterar sobre esa colección y obtener los equipos de un cliente:

      foreach(Equipo oEquipo in oClienteActual.Equipos)
      {
      Console.Write(oEquipo.Nombre);
      }

      o bien

      gridEquipos.DataSource = oClienteActual.Equipos;

      Un detalle a tener en cuenta, o mejor dicho un método que permite mejorar la performance es el Lazy Load. Esto sirve para que la lista de Equipos se llene solo cuando la necesitamos.

      Con respecto a tu segunda pregunta, con la enumeración creo que sería bastante flexible a futuro. Sería algo asi:

      public enum EstadoEquipo = {No Disponible, Disponible};

      public EstadoEquipo Estado { get; set; }

      Esa enumeración supondrá que No Disponible = 0, Disponible = 1… si usas otros valores hay que ponerlo explicitamente…

      Saludos!

      Comentario por pabloide86 — septiembre 4, 2009 @ 12:36 am

  5. Hola Pabloide, muy buen aporte.Llevaba mucho tiempo documentandome al respecto y puedo decir que es el mejor ejemplo que he visto hasta ahora. Facil , conciso y muy bien explicado. Por gente como tú me hice programador.

    Mil gracias Pabloide. Recomendaré tu blog.

    Saludos.

    Comentario por Antonio — octubre 5, 2009 @ 12:59 pm

  6. Excelente aporte amigo, hacia rato buscaba un ejemplo sobre este tema. Te loa agradesco.

    Comentario por The Alviz — junio 16, 2010 @ 5:01 pm

  7. Excelente aporte. Formulé una pregunta en msdn sobre el tema y en los relacionados encontre el blog. Estoy en lo mismo nada mas que con ASP.NET con C#.

    Comentario por Miguel — julio 14, 2010 @ 1:59 pm

  8. Antes de haber comentado no había visto la solución. Tenía dudas acerca de como interactuar con los objetos creados en la capa de presentación. Como por ejemplo un datagrid o algo por el estilo, y ahora me ha quedado claro como los list funcionan de intermediarios. Ahora bien con la propiedad datasource del grid se iguala al resultado de la lista verdad? asi lo entendí.

    Me imagino que la lógica para modificar y eliminar es primero obtener el Id y de allí ejecutar el procedimiento, si no me equivoco.

    Una ultima pregunta! Necesito realizar dos tipos de autenticaciónes. Primeramente LDAP para verificar si el usuario existe en el dominio y luego en una tabla. Algun consejo?

    Comentario por Miguel — julio 14, 2010 @ 2:17 pm

    • Hola Miguel! Gracias por el comentario!

      Con respecto a la primer pregunta, así es… grid.DataSource = lista; donde lista = List…
      Lo otro que se puede hacer es arrastrar y soltar un ObjectDataSource desde el toolbox y usar eso como DataSource de la grilla… el ObjectDataSource lo configuras con tu Entidad y luego con los 4 metodos que usas de la capa de negocios para hacer SELECT, INSERT, UPDATE y DELETE… (no te olvides de indicarle a la grilla cuales son los DataKeyNames)… y vas a ver tambien que el ObjectDataSource tiene para configurarle de donde vas a sacar los parámetros para pasarle a cada método…

      Y con respecto a la última pregunta, me imagino que con LDAP queres autenticar el usuario (si tiene permisos para loguearse) y con la tabla queres autorizar el acceso a determinada página o acciones no?

      http://www.codeproject.com/KB/aspnet/activedirectoryuse.aspx aqui hay un artículo sobre como consultar a LDAP… y la consulta a la tabla la haces desde tu capa de acceso a datos… espero haber evacuado tus dudas…

      Saludos!!

      Comentario por pabloide86 — julio 14, 2010 @ 10:01 pm

      • Hola!

        Pues bien, creo que abarcaste mis dudas al respecto. Y básicamente esas eran las interrogantes de las que esperaba encontrar respuesta, resulta que no había tenido experiencia trabajando en capas y tampoco en asp.net. La parte de web la trabajaba con php.

        Estoy probando con un GridView, lo igualo al resultado de la lista pero igual, no me carga nada. Supongo que se debe a que es necesario el uso de bindings. Lo que me deja con incognita es que el datasource NO debe de estar usandose en la Capa de Presentación no?. No me había acostumbrado al uso de objetos gráficos si no al crearlos por código, por lo que entender esa lógica se me ha hecho difícil.

        Con lo de LDAP, precisamente ese es el propósito. Primero se verifica si existe en el dominio, luego existe una tabla de usuarios autorizados para agregar un determinado permiso al usuario. Depende del mismo puede adminstrar una accion o solo visualizarla.

        Gracias por responder.

        Saludos.

        Comentario por Miguel — julio 17, 2010 @ 1:39 pm

      • Miguel, te dejo el link de dos artículos interesantes que encontré sobre el GridView y ObjectDataSource:

        http://www.asp.net/data-access/tutorials/displaying-data-with-the-objectdatasource-cs

        http://www.codegod.de/webappcodegod/Binding-an-ASP-NET-GridView-to-ObjectDataSource-AID478.aspx

        Saludos!

        Comentario por pabloide86 — julio 18, 2010 @ 12:56 pm

      • Hola!

        Te estoy muy agradecido por los links que me has pasado!. Está muy completo y aprovecho para evaluar como estaba construyendo las capas que tenía creadas. Cualquier cosa te escribiré ya que, amigo, has sido de mucha ayuda.

        Dios te bendiga!

        Saludos.

        Comentario por Miguel — julio 19, 2010 @ 11:54 am

  9. Hola! Te cuento que los links que me pasaste me han servido de mucho.. Solo que al final de cuentas no trabajo con un objectDataSource si no más bien con la propiedad DataSource del objeto (gridview o dropdown por ejemplo). Así es como me han guiado para el proyecto aunque bueno también depende de mi criterio.

    Tengo una duda, estoy creando una clase para cada entidad(osea tabla). Pero cuando tengo un dato foraneo me han explicado que es necesario crear el IdForaneo del tipo de la clase a la que pertenece. No se si me explico? pero bien la duda está en la utilizacion de dicha funcion que me devuelve ese dato de otra clase.

    Mi correo es jam_28@hotmail.com por si tenes tiempo de explicarme algunas cosas. Te agradezco por la ayuda.

    Comentario por Miguel — julio 21, 2010 @ 12:57 pm

    • Con lo de clases por cada entidad se debe a que el modelo es de 4 capas.

      algo así.

      Class bClientes
      {
      int idCliente;
      String nombreCliente;
      bTipoClientes idTipoClientes;

      public int IDCLIENTE {set; get;}
      public String NOMBRECLIENTE {set; get; }

      public bTipoClientes IDTIPOCLIENTES
      {
      que es lo necesario dentro de esta propiedad?
      }
      }

      Class bTipoClientes
      {
      int idTipoCliente;
      String descTipoCliente;

      public int… ya se sabe que va aquí jeje!

      }

      me explico? Espero puedas ayudarme.

      Comentario por Miguel — julio 21, 2010 @ 4:55 pm

  10. Hola!! Buenos días.

    Quiero decirte que el proyecto ha culminado y darte agradecerte por haberme ayudado, ya que en ese momento tenía muchas dudas. Gracias!

    Comentario por Miguel — agosto 14, 2010 @ 12:24 pm

  11. Migo muy buen ejemplo no sabes cuando me has ayudado. mil gracias. y un fuerte abrazo..

    Comentario por juan — junio 16, 2011 @ 4:20 pm

    • Gracias! Hace bastante que no actualizamos el blog! Quedo un poco desactualizado el ejemplo pero el concepto sirve 😉 apenas tenga tiempo voy a actualizarlo con cosas nuevas!

      Saludos!!

      Comentario por pabloide86 — junio 16, 2011 @ 5:06 pm

  12. Muchas gracias por tu aportación, la estructura del codigó es excelente.

    Comentario por danyrdz — febrero 18, 2012 @ 3:57 pm

  13. Buen Aporte, Claro, entendible y justo como lo quería que me explicaran ya que he estado aprendiendo a programar en capas y me resultaba algo difícil, Gracias!

    Comentario por Beto — marzo 15, 2013 @ 1:47 pm

  14. Nadie lo pudo haber explicado mejor!!!
    Graciassssssss.

    Comentario por Gaby — marzo 26, 2014 @ 9:48 pm


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: