Foros del Web » Programación para mayores de 30 ;) » .NET »

[Duda] C# Arquitectura 3 Capas

Estas en el tema de [Duda] C# Arquitectura 3 Capas en el foro de .NET en Foros del Web. Buenas, estoy desarrollando una pequeña aplicación en c# .net 4.0 con una arquitectura en 3 capas, de la siguiente manera. El proyecto "Windows Forms" Principal ...
  #1 (permalink)  
Antiguo 27/07/2011, 14:57
 
Fecha de Ingreso: agosto-2007
Mensajes: 26
Antigüedad: 16 años, 8 meses
Puntos: 0
Pregunta [Duda] C# Arquitectura 3 Capas

Buenas, estoy desarrollando una pequeña aplicación en c# .net 4.0 con una arquitectura en 3 capas, de la siguiente manera.

El proyecto "Windows Forms" Principal (Capa Interfaz)
El proyecto "Windows Library" Logica
El proyecto "Windows Library" Entidades (Los dos representarian la capa de Negocio)
El proyecto "Windows Library" Datos (Capa Datos)

En Entidades tengo clases que contienen atributos, propiedades, campos y algun que otro metodo sencillo
(Cliente, Factura, etc).

En Logica hasta ahora agrege las clases que realizarian las operaciones de buscar y o muchos clientes, facturas, etc; agregar, actualizar y eliminar.

En Data tengo las clases que realizan la interacción con la db, conexcion, comandos SQL, transacciones, etc.


Ahora tengo una super duda, En la Interfaz(I) agrego una instancia de la Entidad(E) para cargar los datos estilo ABM,
pero si es esa entidad tengo una propiedad Ciudad (donde Ciudad es una clase, entidad y logica)
donde tendria que agregar la funcionalidad de buscar y asignar la ciudad seleccionada a la instancia de la entidad Cliente

Ej:
Código:
namespace Entidades
{	
	public class Cliente
	{
		public Cliente()
		{
		}
		private string _Nombre = string.Empty ;
		public string Nombre
		{
			get{return _Nombre;}
			set{_Nombre = value;}
		}
		private Ciudad _Ciudad = null;
		public Ciudad Ciudad
		{
			get{return _Ciudad;}
			set{_Ciudad = value;}
		}		
	}
	
	public class Ciudad
	{
		public Ciudad()
		{
		}
		private int _CodigoPostal = 0 ;
		public int CodigoPostal
		{
			get{return _CodigoPostal;}
			set{_CodigoPostal = value;}
		}
		private string _Descripcion = string.Empty ;
		public string Descripcion
		{
			get{return _Descripcion;}
			set{_Descripcion = value;}
		}		
	}
}
Si la arquitectura que estoy planteando no es correcta, cual seria una adecuada ?

Muchas gracias
  #2 (permalink)  
Antiguo 27/07/2011, 15:04
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 12 años, 9 meses
Puntos: 33
Respuesta: [Duda] C# Arquitectura 3 Capas

No muy te entiendo, pero, yo, por ejemplo, trabajo a 4 capas, porque tengo la capa de entidades como una entidad separada, para instanciar solo la entidad, e instanciar la logica...
  #3 (permalink)  
Antiguo 27/07/2011, 15:30
Avatar de othix  
Fecha de Ingreso: mayo-2011
Ubicación: Guatemala
Mensajes: 92
Antigüedad: 12 años, 10 meses
Puntos: 9
Respuesta: [Duda] C# Arquitectura 3 Capas

De esta manera lo podes usar

Entidad.Ciudad.tumetodo(tusParametros)

o

Entidad.Ciudad.tuPropiedad
  #4 (permalink)  
Antiguo 27/07/2011, 16:17
 
Fecha de Ingreso: agosto-2007
Mensajes: 26
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: [Duda] C# Arquitectura 3 Capas

Cita:
Iniciado por HaverRamirez Ver Mensaje
No muy te entiendo, pero, yo, por ejemplo, trabajo a 4 capas, porque tengo la capa de entidades como una entidad separada, para instanciar solo la entidad, e instanciar la logica...
Yo tengo las entidades como un proyecto separado no se si referis a eso (Adjunto imagen)
[URL=http://imageshack.us/photo/my-images/192/clases.jpg/][IMG=http://img192.imageshack.us/img192/9509/clases.jpg][/IMG][/URL]
En la lógica tengo una referencia a Entidad y Data.
Ahora yo en un formulario creo una instancia:

Cita:
Entidad.Persona p;
Logica.Personas ps = new Logica.Personas(); //Creo la instancia de personas
p = ps.GetOne(1); // Busco la persona por el id
Hasta aca esta todo bien porque en la capa de datos lleno todos los datos de la persona,Incluyendo la ciudad porque le hago
Cita:
Persona.Ciudad = Data.CiudadAdapter.GetOne(xData.idCiudad); //Donde xData es la información de la db
y devuelvo un obj Entidad.Persona

Pero si yo quiero crear un nuevo registro tengo:
Cita:
Entidad.Persona p = new Entidad.Persona();
p.Nombre = "Nombre 1";
p.Apellido = "Nombre 2";
p.idCiudad = 1;
//Falta funcionalidad para asignar a la p.Ciudad el obj Ciudad
text1.text = p.Ciudad.Descripción;
de que manera, ya sea en la entidad o en la lógica, tengo que agregar la funcionalidad para buscar la ciudad y agregarsela a la entidad ciudad.

Si lo quiero hacer en la entidad. No puedo porque no tengo referencias a Data o Logica y no puedo agregar por la referencia cíclica.

Si lo quiero hacer desde Logica.Personas tengo visibilidad pero se como armar la funcionalidad


Sino, de que manera tienes armada la arquitectura en 4 capas?

Cita:
Iniciado por othix Ver Mensaje
De esta manera lo podes usar

Entidad.Ciudad.tumetodo(tusParametros)

o

Entidad.Ciudad.tuPropiedad
Si de esa manera lo puedo utilizar si ya tengo instanciado el objecto ciudad dentro de la entidad. la pregunta es como asignar el objecto a la entidad.

Saludos
  #5 (permalink)  
Antiguo 27/07/2011, 16:33
Avatar de HaverRamirez  
Fecha de Ingreso: junio-2011
Ubicación: Guatemala
Mensajes: 273
Antigüedad: 12 años, 9 meses
Puntos: 33
Respuesta: [Duda] C# Arquitectura 3 Capas

Haber, Haber , creo que ya me hice un lio, mira, tu capa entidad tiene una propiedad de la ciudad
ok

class persona
''la propiedad de la ciudad
public property Ciudad as Ciudad

si estas agregandole a la persona una ciudad, es una ciudad ya existente, entonces no necesitas mandarle la descripcion de la ciudad, solo el id, porque asi se insertaria en la base de datos...recuerda que la propiedad accede a la clase ciudad entonces tienes que acceder a su propiedad desde la clase ciudad NO persona.ciudad, a menos que estes agregando nueva ciudad en tal caso tienes que crear una instancia de ciudad y pasarla a la persona, y ahi si es valido

Dim NCiudad as new CapaEntidades.Ciudad
Persona.ciudad = NCiudad

de lo contrario.

persona.nombre = "ALGUIEN"
persona.Ciudad.ID = 1

algo asi te entendi
  #6 (permalink)  
Antiguo 09/08/2011, 16:57
 
Fecha de Ingreso: agosto-2007
Mensajes: 26
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: [Duda] C# Arquitectura 3 Capas

Cita:
Iniciado por HaverRamirez Ver Mensaje
Haber, Haber , creo que ya me hice un lio, mira, tu capa entidad tiene una propiedad de la ciudad
ok

class persona
''la propiedad de la ciudad
public property Ciudad as Ciudad

si estas agregandole a la persona una ciudad, es una ciudad ya existente, entonces no necesitas mandarle la descripcion de la ciudad, solo el id, porque asi se insertaria en la base de datos...recuerda que la propiedad accede a la clase ciudad entonces tienes que acceder a su propiedad desde la clase ciudad NO persona.ciudad, a menos que estes agregando nueva ciudad en tal caso tienes que crear una instancia de ciudad y pasarla a la persona, y ahi si es valido

Dim NCiudad as new CapaEntidades.Ciudad
Persona.ciudad = NCiudad

de lo contrario.

persona.nombre = "ALGUIEN"
persona.Ciudad.ID = 1

algo asi te entendi
Hmm... Si entendi, muchas gracias me resulto muy util.

Ahora si en el mismo momento que asigno el id de la ciudad a la persona.
Quiero mostrar el nombre de la ciudad, como tendria que rellenar los datos ?

Saludos
  #7 (permalink)  
Antiguo 14/08/2011, 16:42
Avatar de dwaks  
Fecha de Ingreso: agosto-2002
Ubicación: Panamá
Mensajes: 962
Antigüedad: 21 años, 8 meses
Puntos: 15
Respuesta: [Duda] C# Arquitectura 3 Capas

La arquitectura en capas tienen como motivo principal:

1- Fácil de mantener
2- Escalable
3- Fácil de probar usando Unit Test

Pensando en estos 2 motivos es que muchas empresas contratan arquitectos de software para poder poner las cosas en su lugar y así tener un sistema más estable. La estabilidad se logra entre pruebas y arreglos de errores, pero sino es un código con las 2 características que indico arriba será una tarea casi imposible.

Ahy muchos patrones que dan rumbo a codificación estable y lamentablemente nadie jamás habla de ellas. Los patrones en su mayoría están diseñados en capas. Ahora bien veamos unos patrones que serán de muchísimo uso para tí así entenderás en un corto plazo donde poner cada parte de tu código.

1- Data Layer

Este es por si mismo el más importante debido a que la mayoría de los programas guardan su información o interactuan con base de datos. Pero lamentablemente este layer puede estar tan desacoplado entre sus miembros mezclando más patrones para tener una estructura más robusta que permita un alcanze más preciso a futuros cambios.

Aquí solo te hablaré de 2 patrones en especial.

1- Domain Model
2- Repository Pattern

Domain Model

Domain Model es el conjunto de clases que tienen un significado lógico para el negocio y que representan un tipo especifico de objeto en la base de datos. Un ejemplo simple es por ejemplo un cliente. Para la empresa un cliente es una objecto que tiene como propiedades nombre, apellido, edad, cedula, dirección, etc etc.

Todas esas propiedades representan una columna de la tabla Cliente de la base de datos. Entonces para nosotros los programadores buscando metodologias y patrones buenos llegamos a lo que son los ORM. El mapeo relacional de objetos es una conversión de row de una tabla a una clase en memoria. Osea que a la tabla Cliente se le crea una clase Cliente con todas las propiedades. Los ORM de microsoft como EntityFramework y Linq to Sql hacen este trabajo por nosotros. Puedes informarte en google de estos 2 ORM de microsoft.

Los ORM nos generan las clases que representarán nuestro Domain Model. Haciendo uso de un tool ORM como Entity Framework podemos convertir la base de datos en clases que menos de 1 minuto y el genera todo por nosotros.

Repository Pattern

Este patrón nos ayuda a tener un código limpio y es nuestro punto de acceso a los datos. Debe quedar claro que el no valida nada, los datos que se le pasan a el deben ya venir limpios y al invocar algún método de algún repositorio es porque la data va segura, ya más adelante explico quien valida.

El repositorio es una clase que interactua con 1 tipo especifico del Domain Model y la base de datos. Y Siempre devuelve un objeto jamas devuelve un pedazo del objeto.

Una clase ejemplo seria ClienteRepository con métodos como por ejemplo ObtenerCliente(int id), CrearCliente(Cliente obj).

Cada método tiene la lógica necesaria que la representa, ejemplo:

Código C#:
Ver original
  1. public void CrearCliente(Cliente obj)
  2. {
  3.     context.AddToCliente(obj);
  4. }

El context es un ObjectContext generado por el EntityFramework, cuando leas sobre el EntityFramework entenderás esta parte.

Otro ejemplo sería:

Código C#:
Ver original
  1. public Cliente ObtenerCliente(int id)
  2. {
  3.     return context.Clientes.Where(c => c.ClienteID == id).FirstOrDefault();
  4. }

Este con el ID te devuelve el objeto Cliente que fue encontrado en la base de datos. Los métodos que puede tener un Repositorio son 4 bases + todos los extras que quieras agregar. Buscate información de este patrón y verás más.

2- Service Layer o Controller Layer

El Layer de Servicio es una librería que tiene la lógica de validación, comparación, conversión, log de error y depuración, todo lo demás.

Aca puede hacerse uso de muchos más patrones cada uno para un caso específico pero veamoslo como nuestro Layer de lógica del negocio. Debes saber que la lógica de negocio es donde esta las reglas y validaciones propias del negocio.

Un ejemplo simple es que si un cliente solo es aceptado para mercado local aquí va lógica como por ejemplo, si el cliente es de Estados Unidos entonces lo agrego a la base de datos sino es de allá retorno un error diciendo que esta en un mercado fuera del rango de la empresa. Si en 2 años la empresa acepta de España solo haces cambio en el Servicio que tiene la lógica que valida esta información y listo.

3- Layer de Objetos Comunes.

En la actualidad ya muchos sistemas implementan servicios ya sea por soap ó tcp ip haciendo uso de Windows Communication Foundation. Sabemos que este framework cuando uno hace referencia a un servicio auto genera las clases y el proxy de comunicación pero integrando mejor seguridad y performance no se hace de este modo, el WCF framework nos permite hacer uso de su API para que nosotros mismos manipulemnos la configuración y el proxy de forma dinámica, eliminando la posibilidad de abrir el servicio para ser referenciado, entonces mientras más dividido tengamos nuestros objetos comunes normalmente llamados abstracciones de nuestro domain model también ponemos los contratos dentro de este layer.

Otro tipo de objetos que reciden alli son Excepciones propias, configuraciones, librerias de utilidades, librerias genericas, todo lo que sea reutilizable por muchos más sistemas.

QUE TENEMOS HASTA AHORA

Tenemos 3 proyectos

1- Company.Data
2- Company.Logic
3- Company.Common

Esto sería una base muy buena de arquitectura a seguir en cada proyecto con algunos patrones anidados cada uno en su layer especifico.

Ahora cuando entren los visuales solo serán para efecto de captura de ordenes que serán procesadas por los 3 proyectos de arriba.

Ahy un proyecto más que seria el Layer del ServicioWeb ó ServicioRemoto, que en realidad sería un facade. El facade es un patrón que es dar acceso a la librería pura pero depurando que es lo unico a lo que tendran acceso y que permisos requieren. Esta seria un WCF project y alli estarían las clases wrapper que son intermediarios con extra lógica de permisos y demás a la libreria Logic y sus servicios. En el WCF proyect solo pones lo que quieres que los proyectos Visuales tengan acceso de la libreria Logic.

Si quieres hacer un programa que su visual sea un web, y la información este en la base de datos, pero que el visual todo se lo pida a un servicio web tendrías los siguientes proyectos.

1- Data
2- Logic
3- Common
4- Services
5- Web

Espero haber ayudado un poco más con información relacionada a el tema arquitectura en capas.

Última edición por dwaks; 14/08/2011 a las 16:47
  #8 (permalink)  
Antiguo 16/08/2011, 11:28
 
Fecha de Ingreso: agosto-2011
Ubicación: Buenos Aires
Mensajes: 78
Antigüedad: 12 años, 8 meses
Puntos: 10
Respuesta: [Duda] C# Arquitectura 3 Capas

Te recomiendo este link sobre la programación en capas

http://www.orientadoanet.com/2011/07/programacion-en-capas-introduccion.html
__________________
www.orientadoanet.com
  #9 (permalink)  
Antiguo 16/08/2011, 13:22
 
Fecha de Ingreso: agosto-2007
Mensajes: 26
Antigüedad: 16 años, 8 meses
Puntos: 0
Respuesta: [Duda] C# Arquitectura 3 Capas

Muy buena explicación dwaks y muy bueno el link laguzzigerardo.

De esa forma es exactamente como tengo planteada la aplicación !

Lo que yo estaba tratando de entender es como trabajar con ese modelo pero teniendo dentro de las entidades instancias de otras entidades y como manipularlas, cargarlas eliminarlas.

Ya que todos los ejemplos y tutoriales son sencillos tienen una clase cliente, y clases sueltas sensillas.

No se si se entiende pero si yo tengo:
1 factura (oFactura) que tiene dentro muchas lineaDeVenta
* lineasDeVenta (oLineasDeVentas[*])
que cada linea de venta tiene un producto (oProducto)
y ese producto tiene mucha información.

de que manera se iría cargando toda la información si yo quiero visualizar 100 facturas ,voy a tener que cargar 100 facturas, 999999 lineaDeVenta, 99999 productos, etc todo al mismo tiempo ?

Si no lo cargo todo, como seria una manera de ir cargando a medida que necesito acceder a la información.

en un rato voy a tratar de preparar un mini proyecto con una idea de lo que no puedo entender a ver si por hay con eso se entiende un poco mas el problema.

Saludos y Gracias

Etiquetas: c#capas, entidades, interfaz, logica
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:09.