Implementación n capas

30/03/2008 - 15:25 por Guillermo Peralta | Informe spam
Hola;

Tengo una duda relacionada con la implementación en "n" capas.

Supongamos una capa Negocio y una capa Datos, y un objeto Maestro/Detalle
como podria ser el caso de una Factura

FACTURAS
NroFactura
Fecha
Renglones //coleccion generic de Detalle de Factura


Segun lo que entiendo, la separación en capas me permite lograr que desde
Interfaz de usuario, simplemente llamar a Negocio.Guardar (oFactura) y nada
mas.

Desde Negocio llamo a mi capa de datos, lo que en pseudocodigo queda algo
como:

<Inicio>
<Transaction>
Datos.Factura.Guardar (oFactura) //guardo el encabezado

Datos.DetalleFactura.Guardar (oFactura.Renglones) //guardo el
detalle
<FinTransaction>
<Fin>

La Capa de Datos es la que se encarga de llamar a los Command
correspondientes segun el proveedor de datos que este trabajando (SQL,
Oracle, etc.)

Las preguntas son (por fin!),
¿En qué momento se debe abrir la conexion? Desde la capa de Negocio o cada
objeto de Datos debe abrir/cerrar su conexion?
¿Como es en este caso el manejo de transacciones? ¿Debe ser manejada desde
la capa de Negocios? ¿Esto no hace que no sea independiente del motor de
base de datos? Es decir, desde mi capa de negocio debo tener una Refencia a
System.Data.dll. .? o solamente a MiCapaDatos.dll


Sé muy bien que no hay soluciones únicas, ni respuestas mágicas, solo
pretendo aclarar un poco más la situación.

Muchas Gracias

Guillermo
 

Leer las respuestas

#1 Alberto Poblacion
30/03/2008 - 17:16 | Informe spam
"Guillermo Peralta" <guillermoperalta(-a.r.r.o.b.a.-)onenet.com.ar> wrote in
message news:
[...]
Las preguntas son (por fin!),
¿En qué momento se debe abrir la conexion? Desde la capa de Negocio o cada
objeto de Datos debe abrir/cerrar su conexion?



La conexión es más bien propia de la capa de datos. No hay problema en
abrir y cerrar numerosas veces la conexión, ya que el sistema de "pooling"
se encarga automáticamente de optimizar este proceso.

¿Como es en este caso el manejo de transacciones? ¿Debe ser manejada desde
la capa de Negocios? ¿Esto no hace que no sea independiente del motor de
base de datos? Es decir, desde mi capa de negocio debo tener una Refencia
a System.Data.dll. .? o solamente a MiCapaDatos.dll



Una forma de resolverlo es implementar en capa de datos una función que
sea "ComenzarTransacción", y las correspondientes funciones para terminarla,
y llamar desde capa de negocio a esta función.

Si estás programando con .Net Framework versión 2 o superior, puedes usar
desde capa de negocio el objeto TransactionScope (en System.Transactions),
que te permite indicar el ámbito de la transacción sin tener que conocer el
proveedor de la base de datos. TransactionScope sirve para realizar
transacciones distribuidas, pero si lo usas contra Sql Server y todas las
conexiones las realizas a la misma base de datos, tiene la inteligencia
suficiente para generar una transacción local en lugar de distribuida.

Sé muy bien que no hay soluciones únicas, ni respuestas mágicas, solo
pretendo aclarar un poco más la situación.



Efectivamente, ninguna solución es mágica. Las respuestas anteriores son
solo un par de sugerencias, pero no quiere decir que siempre deba realizarse
una implementación de esta manera.

Preguntas similares