Arquitectura en 3 capas, para expertos

26/07/2004 - 00:40 por Zeus | Informe spam
Hola, voy a realizar un nuevo proyecto en VB .Net (una
típica facturación, pedidos, albaranes y facturas de
compras y ventas), bueno he oído hablar de la
arquitectura de tres capas o n capas, me he puesto a
buscar información y he encontrado en MSDN, y te explica
las distinta capas: IU, la lógica de aplicación o
negocio y la de los datos. Todo lo entiendo en la teoría
pero no lo veo en la práctica, como se comunica IU con la
capa de la lógica del negocio o aplicación, está claro
que en la capa de aplicación mediante lo clase de ADO.Net
y el gestor de base de datos es el encargado de
comunicarse entre estas dos capas. Estoy dando un
cursillo de ASP. Net y he visto los servicios Web, esto
se podría decir que la IU a realizar llamadas a los
servicio Web es la comunicación entre esta dos capas, es
decir, Una capa es la IU y la otra capa (lógica del
negocio) es la parte de la aplicación realizada en los
servicios Web. Si no me equivoco esto es lo que propone
Microsoft como arquitectura a la hora de diseñar o crear
un proyecto.

¿Estoy encaminado o lo he entendido mal?
¿Me aconsejáis que realice mi aplicación en esta
arquitectura?
¿O es mejor en dos capas cliente/servidor para este tipo
de proyecto para no complicarme?
Solo quiero que me aconsejéis, hablarme más sobre esta
arquitectura e indicarme donde puedo haber algún ejemplo
simple de una aplicación entre capas (código fuente, me
da igual que sea C# o VB .net) ya que en la práctica se
ve mejor todo lo que se dice en la teoría. También donde
podría encontrar más información sobre esta arquitectura.

Un saludo
Zeus

Preguntas similare

Leer las respuestas

#11 DJ_MIAO
27/07/2004 - 17:47 | Informe spam
Ejele que paso con yo.
No comento sobre ese tema porque va mas alla de mis
conocimientos tendria que comprarme un libro para aportar
algo.

Martin <> DJ_MIAO
Aparentemente martin se fustro por la contestacion de
otro.
No me danen mi nombre.

Gracias!!!


Miao...

Hola, voy a realizar un nuevo proyecto en VB .Net (una
típica facturación, pedidos, albaranes y facturas de
compras y ventas), bueno he oído hablar de la
arquitectura de tres capas o n capas, me he puesto a
buscar información y he encontrado en MSDN, y te explica
las distinta capas: IU, la lógica de aplicación o
negocio y la de los datos. Todo lo entiendo en la teoría
pero no lo veo en la práctica, como se comunica IU con


la
capa de la lógica del negocio o aplicación, está claro
que en la capa de aplicación mediante lo clase de


ADO.Net
y el gestor de base de datos es el encargado de
comunicarse entre estas dos capas. Estoy dando un
cursillo de ASP. Net y he visto los servicios Web, esto
se podría decir que la IU a realizar llamadas a los
servicio Web es la comunicación entre esta dos capas, es
decir, Una capa es la IU y la otra capa (lógica del
negocio) es la parte de la aplicación realizada en los
servicios Web. Si no me equivoco esto es lo que propone
Microsoft como arquitectura a la hora de diseñar o crear
un proyecto.

¿Estoy encaminado o lo he entendido mal?
¿Me aconsejáis que realice mi aplicación en esta
arquitectura?
¿O es mejor en dos capas cliente/servidor para este tipo
de proyecto para no complicarme?
Solo quiero que me aconsejéis, hablarme más sobre esta
arquitectura e indicarme donde puedo haber algún ejemplo
simple de una aplicación entre capas (código fuente, me
da igual que sea C# o VB .net) ya que en la práctica se
ve mejor todo lo que se dice en la teoría. También donde
podría encontrar más información sobre esta arquitectura.

Un saludo
Zeus

.

Respuesta Responder a este mensaje
#12 DJ_MIAO
27/07/2004 - 18:09 | Informe spam
Flaco utiliza una estructura y te economisas estar todo
el dia escribiendo property



Imports System.Data.OleDb
Imports System.Data.Common
Public Class DataClass
Structure Infodata
Dim strPinche As String
Dim strDescripcion As String
Dim strComentarios As String
Dim strSexo As String
Dim intFlagFoto As Integer
Dim strDirFoto As String
Dim strfecha As Date
Dim intFlagImagen As Integer
Dim IntFlagEscojido As Integer
Dim strQry As String
End Structure


Public Property ProDataInfo() As Infodata
Get
Return StructData

End Get

Set(ByVal Value As Infodata)

StructData = Value

If StructData.strDescripcion.Length = 0
Then
Throw New System.Exception("Favor de
insetar la descripcion")
Else
Trim(StructData.strDescripcion)
End If

Trim(StructData.strComentarios)
Trim(StructData.strDirFoto)
Trim(StructData.strPinche)
Trim(StructData.strSexo)
Trim(StructData.strQry)
End Set
End Property

Miao..



Codigo47 mi contestacion era para DJ_MIAO.
"Codigo47" escribió en el


mensaje news:exy$
que te metes chavon ?, no te das cuenta que el falco


DJ_MIAO, entro al foro, leyo el asunto de Zeus y no solo
no lo contestó sino que se puso a insultarlo porque no
comprendia algo !!!!!!!. Esa fue la falta de respeto.

Y para no irme de tema, Zeus te paso una solución que


vi en una charla de un señor que se llama Angel "Java"
Lopez:

La idea es esta:



La capa de ENIDADES EMPRESARIALES es esto:

Public Class Cliente
Dim mIDCliente As Integer
Dim mRazonSocial As String
Dim mEmail As String

Public Property IDCliente() As Integer
Get
Return mIDCliente
End Get
Set(ByVal Value As Integer)
mIDCliente = Value
End Set
End Property

Public Property RazonSocial() As String
Get
Return mRazonSocial
End Get
Set(ByVal Value As String)
mRazonSocial = Value
End Set
End Property

Public Property EMail() As String
Get
Return mEmail
End Get
Set(ByVal Value As String)
mEmail = Value
End Set
End Property
End Class

Fijate que es una clase simple, solo con propiedades,


que son ni mas ni menos que los datos que tengas en la
tabla Clientes en la base de datos de tu proyecto. Crea
clases para todas las entidades que deba manejar el
sistema.

CAPA DE PRENSENTACION, Formularios o Paginas web ASP,


el resto de las capas no cambia para cualquiera de estas
dos formas de presentacion.

CAPA DE ACCESO A DATOS: en esta capa van a existir


clases para guardar los datos de las clases de Entidades
Empresariales en la base de datos, lo que se llama mapear:

Imports CapaEntidadEmpresarial

Public Class MapeoCliente
Public Function Agregar(ByVal Cliente As Cliente)


As Integer

End Function

Public Sub Modificar(ByVal Cliente As Cliente)

End Function

Public Sub Borrar(ByVal IDCliente As Integer)

End Function

Public Function Buscar(ByVal Cliente As Cliente)


As ColeccionCliente

End Function
End Class

Fijate que las funciones de esta clase reciben una


Entidad Empresarial (Cliente) y la guardan en la base de
datos (je saque el codigo que guarda en la base porque es
bastante confuso para explicar "capas").

En la funcion AGREGAR escribir codigo para que tome


los datos del objeto Cliente y los guarde en la base, con
SQL embebido ("insert into Cliente...") para Access o
MySQL o con una llamada a un Store Procedure, si usas SQL
Server, Oracle o DB2.

Tambien mira la funcion Buscar, esta funcion recibe un


objeto Cliente y usando SQL o un Store Procedure, busca
los datos en la base u los devuelve en una coleccion de
objetos Cliente, las colecciones las armo asi:

Public Class ColeccionCliente
Inherits System.Collections.CollectionBase

Public Sub Add(ByVal Objeto As Cliente)
list.Add(Objeto)
End Sub

Public Sub Remove(ByVal Index As Integer)
If Index > Count - 1 Or Index < 0 Then
Throw New System.Exception("Índice de


Colección Inválido")
Else
List.RemoveAt(Index)
End If
End Sub

Public ReadOnly Property Item(ByVal index As


Integer) As Cliente
Get
Return CType(List.Item(index), Cliente)
End Get
End Property
End Class

se hereda de la clase CollectionBase que es una


coleccion base que viene en el Framework, para poder
implementar una coleccion que solo acepte objetos de tipo
Cliente, si se usas un arraylist, se pueden agregar
cualquier tipo de Objetos, por eso uso este tipo de
coleccion. Ademas que me parece una manera muy efectiva
para la comunicacion entra las capas, fijate que el unico
que conoce el nombre de los campos de la base de datos y
como llegar a ellos es la Capa de Acceso a Datos, y
ninguna otra !.
Esta Coleccion de objetos Cliente la declaro en la


Capa de Entidades Empresariales.

La CAPA DE SERVICIOS: es una capa intermedia entre la


presentacion y el acceso a datos, y la funcion es
justamente aislar a la presentacion del acceso a datos,
para que, cualquier cambio que se realize en el acceso a
datos no se vea reflejado en la presentacion y
sea "amortiguado" por esta capa de servicios:

Public Class ServicioCliente
Public Sub AgregarCliente(ByVal Cliente As Cliente)
Dim M As New MapCliente()

M.Conectar()

M.Agregar(Cliente)

M.Desconectar()
End Sub

Public Function BuscarCliente(ByVal Cliente As


Cliente) As ColeccionCliente
Dim M As New MapCliente()

M.Conectar()

BuscarCliente = M.Buscar(Cliente)

M.Desconectar()
End Function
End Class

El codigo de esta capa es solamente tomar los datos


que le manda la presentacion, gestionar cuando debe
conectar a la base de datos, llamar a la capa de acceso a
datos para que guarde los datos que vienen de la capa de
presentacion y desconectarse de la base de datos.

Mirando el grafico, nos damos cuenta que cada flecha


de una capa a otra significa REFERENCIA en VB .Net, esto
es, tenemos UNA solucion con 4 proyectos, uno por cada
Capa, el proyecto la Capa Presentacion va a tener
referencia al proyecto de la Capa de Entidades
Empresariales, al igual que el de la Capa de Servicios, y
la Capa de Acceso a Datos. Ademas la Capa de Serivicios
va a tener referencia a el proyecto de la Capa de Acceso
a Datos.

Para despejar cualquier mal explicacion, les dejo una


solucion de ejemplo que trata de implementar esta
arquitectura, esta hecho con access. Si se hiciera con
SQL Server el codigo en la capa de acceso a datos se
reduce mucho !.
Es una pequeña aplicacion que la uso para registrar el


analisis de un nuevo sistema o los errores en los
programas que me envian los clientes. A los errores los
llame "situaciones", ya que no solo registros eso, sino
tambien nuevos agregados, analisis, cosas que debo hacer,
preguntas que yo tengo que hacerle a los clientes, etc.
La idea es que todo lo referente a los sistemas que
desarrollo este guardado en este sistemita.

Problemas de ultimo momento, no lo puedo adjuntar, si


me mandan un mail se los envio !

saludos !.

Codigo47
Analista en Sistemas
Argentina, Buenos Aires
Respuesta Responder a este mensaje
#13 Zeus
27/07/2004 - 18:55 | Informe spam
Hola a todos, soy Zeus. Agradezco a todos por ayudarme y
también a aquellos que no me ayudan e insultan...

Te agradezco Martin de antemano de quererme enviar tu
pequeña aplicación, mi direccion es

Un saludo,
Zeus
Respuesta Responder a este mensaje
#14 DJ_MIAO
27/07/2004 - 19:26 | Informe spam
Y no hago eso?

Public Property ProDataInfo() As Infodata

Yo soy nuevo en esto pero me parece que es una propiedad
pero en ves de usar un tipo de dato usa una estructura ya
ya tienes los tipos de datos cuando lo creas.


Dentro de esa propiedad pones todas la validaciones que
quieras.
Como por ejemplo
If StructData.strDescripcion.Length = 0
Then
Throw New System.Exception("Favor de
insetar la descripcion")



Expertos de esta melodia esta mal lo mio para quitalo del
libro que voy hacer para regalarlo a la gente que no
compra libros aki?

Guille estoy aprendiendo vb.net con tu curso defiendeme.


Miao..





No estas usando las ventajas de la Orientacion A


Objetos, si usas una propiedad podes validar los datos
que entran, procesarlos de alguna forma que se requiera
(segun el programa).
Yo usaria propiedades.

Codigo47
Analista en Sistemas
Argentina, Buenos Aires
"DJ_MIAO"


escribió en el mensaje news:515e01c473f4$0ffeae60
$

Flaco utiliza una estructura y te economisas estar


todo
el dia escribiendo property



Imports System.Data.OleDb
Imports System.Data.Common
Public Class DataClass
Structure Infodata
Dim strPinche As String
Dim strDescripcion As String
Dim strComentarios As String
Dim strSexo As String
Dim intFlagFoto As Integer
Dim strDirFoto As String
Dim strfecha As Date
Dim intFlagImagen As Integer
Dim IntFlagEscojido As Integer
Dim strQry As String
End Structure


Public Property ProDataInfo() As Infodata
Get
Return StructData

End Get

Set(ByVal Value As Infodata)

StructData = Value

If StructData.strDescripcion.Length = 0
Then
Throw New System.Exception("Favor de
insetar la descripcion")
Else
Trim(StructData.strDescripcion)
End If

Trim(StructData.strComentarios)
Trim(StructData.strDirFoto)
Trim(StructData.strPinche)
Trim(StructData.strSexo)
Trim(StructData.strQry)
End Set
End Property

Miao..



>Codigo47 mi contestacion era para DJ_MIAO.
> "Codigo47" escribió en el
mensaje news:exy$
> que te metes chavon ?, no te das cuenta que el


falco
DJ_MIAO, entro al foro, leyo el asunto de Zeus y no


solo
no lo contestó sino que se puso a insultarlo porque no
comprendia algo !!!!!!!. Esa fue la falta de respeto.
>
> Y para no irme de tema, Zeus te paso una solución


que
vi en una charla de un señor que se llama Angel "Java"
Lopez:
>
> La idea es esta:
>
>
>
> La capa de ENIDADES EMPRESARIALES es esto:
>
> Public Class Cliente
> Dim mIDCliente As Integer
> Dim mRazonSocial As String
> Dim mEmail As String
>
> Public Property IDCliente() As Integer
> Get
> Return mIDCliente
> End Get
> Set(ByVal Value As Integer)
> mIDCliente = Value
> End Set
> End Property
>
> Public Property RazonSocial() As String
> Get
> Return mRazonSocial
> End Get
> Set(ByVal Value As String)
> mRazonSocial = Value
> End Set
> End Property
>
> Public Property EMail() As String
> Get
> Return mEmail
> End Get
> Set(ByVal Value As String)
> mEmail = Value
> End Set
> End Property
> End Class
>
> Fijate que es una clase simple, solo con


propiedades,
que son ni mas ni menos que los datos que tengas en la
tabla Clientes en la base de datos de tu proyecto.


Crea
clases para todas las entidades que deba manejar el
sistema.
>
> CAPA DE PRENSENTACION, Formularios o Paginas web


ASP,
el resto de las capas no cambia para cualquiera de


estas
dos formas de presentacion.
>
> CAPA DE ACCESO A DATOS: en esta capa van a existir
clases para guardar los datos de las clases de


Entidades
Empresariales en la base de datos, lo que se llama


mapear:
>
> Imports CapaEntidadEmpresarial
>
> Public Class MapeoCliente
> Public Function Agregar(ByVal Cliente As


Cliente)
As Integer
>
> End Function
>
> Public Sub Modificar(ByVal Cliente As Cliente)
>
> End Function
>
> Public Sub Borrar(ByVal IDCliente As Integer)
>
> End Function
>
> Public Function Buscar(ByVal Cliente As


Cliente)
As ColeccionCliente
>
> End Function
> End Class
>
> Fijate que las funciones de esta clase reciben una
Entidad Empresarial (Cliente) y la guardan en la base


de
datos (je saque el codigo que guarda en la base porque


es
bastante confuso para explicar "capas").
>
> En la funcion AGREGAR escribir codigo para que tome
los datos del objeto Cliente y los guarde en la base,


con
SQL embebido ("insert into Cliente...") para Access o
MySQL o con una llamada a un Store Procedure, si usas


SQL
Server, Oracle o DB2.
>
> Tambien mira la funcion Buscar, esta funcion recibe


un
objeto Cliente y usando SQL o un Store Procedure,


busca
los datos en la base u los devuelve en una coleccion


de
objetos Cliente, las colecciones las armo asi:
>
> Public Class ColeccionCliente
> Inherits System.Collections.CollectionBase
>
> Public Sub Add(ByVal Objeto As Cliente)
> list.Add(Objeto)
> End Sub
>
> Public Sub Remove(ByVal Index As Integer)
> If Index > Count - 1 Or Index < 0 Then
> Throw New System.Exception("Índice de
Colección Inválido")
> Else
> List.RemoveAt(Index)
> End If
> End Sub
>
> Public ReadOnly Property Item(ByVal index As
Integer) As Cliente
> Get
> Return CType(List.Item(index), Cliente)
> End Get
> End Property
> End Class
>
> se hereda de la clase CollectionBase que es una
coleccion base que viene en el Framework, para poder
implementar una coleccion que solo acepte objetos de


tipo
Cliente, si se usas un arraylist, se pueden agregar
cualquier tipo de Objetos, por eso uso este tipo de
coleccion. Ademas que me parece una manera muy


efectiva
para la comunicacion entra las capas, fijate que el


unico
que conoce el nombre de los campos de la base de datos


y
como llegar a ellos es la Capa de Acceso a Datos, y
ninguna otra !.
> Esta Coleccion de objetos Cliente la declaro en la
Capa de Entidades Empresariales.
>
> La CAPA DE SERVICIOS: es una capa intermedia entre


la
presentacion y el acceso a datos, y la funcion es
justamente aislar a la presentacion del acceso a


datos,
para que, cualquier cambio que se realize en el acceso


a
datos no se vea reflejado en la presentacion y
sea "amortiguado" por esta capa de servicios:
>
> Public Class ServicioCliente
> Public Sub AgregarCliente(ByVal Cliente As


Cliente)
> Dim M As New MapCliente()
>
> M.Conectar()
>
> M.Agregar(Cliente)
>
> M.Desconectar()
> End Sub
>
> Public Function BuscarCliente(ByVal Cliente As
Cliente) As ColeccionCliente
> Dim M As New MapCliente()
>
> M.Conectar()
>
> BuscarCliente = M.Buscar(Cliente)
>
> M.Desconectar()
> End Function
> End Class
>
> El codigo de esta capa es solamente tomar los datos
que le manda la presentacion, gestionar cuando debe
conectar a la base de datos, llamar a la capa de


acceso a
datos para que guarde los datos que vienen de la capa


de
presentacion y desconectarse de la base de datos.
>
> Mirando el grafico, nos damos cuenta que cada


flecha
de una capa a otra significa REFERENCIA en VB .Net,


esto
es, tenemos UNA solucion con 4 proyectos, uno por cada
Capa, el proyecto la Capa Presentacion va a tener
referencia al proyecto de la Capa de Entidades
Empresariales, al igual que el de la Capa de


Servicios, y
la Capa de Acceso a Datos. Ademas la Capa de


Serivicios
va a tener referencia a el proyecto de la Capa de


Acceso
a Datos.
>
> Para despejar cualquier mal explicacion, les dejo


una
solucion de ejemplo que trata de implementar esta
arquitectura, esta hecho con access. Si se hiciera con
SQL Server el codigo en la capa de acceso a datos se
reduce mucho !.
> Es una pequeña aplicacion que la uso para registrar


el
analisis de un nuevo sistema o los errores en los
programas que me envian los clientes. A los errores


los
llame "situaciones", ya que no solo registros eso,


sino
tambien nuevos agregados, analisis, cosas que debo


hacer,
preguntas que yo tengo que hacerle a los clientes,


etc.
La idea es que todo lo referente a los sistemas que
desarrollo este guardado en este sistemita.
>
> Problemas de ultimo momento, no lo puedo adjuntar,


si
me mandan un mail se los envio !
>
> saludos !.
>
> Codigo47
> Analista en Sistemas
> Argentina, Buenos Aires
Respuesta Responder a este mensaje
#15 Leonardo Azpurua
28/07/2004 - 01:05 | Informe spam
"DJ_MIAO" escribió en el mensaje
news:516601c473fe$cacf09b0$
Y no hago eso?

Public Property ProDataInfo() As Infodata

Yo soy nuevo en esto pero me parece que es una propiedad
pero en ves de usar un tipo de dato usa una estructura ya
ya tienes los tipos de datos cuando lo creas.


Hola, Miao.

Es sumamente riesgoso hablar sin saber de lo que se habla.

El uso de propiedades no es una restricción del tipo de respetar las luces
rojas de los semáforos aunque no venga nadie. La idea es encapsular el
acceso a los miembros de datos de las clases (sobre todo de las clases
diseñadas para el consumo de otros programadores) para permitir un control
presente y futuro sobre su acceso.

Si publicas una estructura con todos los miembros de datos de la clase,
estás creando una dependencia muchísimo mayor, y peor, que la que se crea al
implementar los miembros de datos como variables públicas. Estás obligando
al usuario de tu clase a asignar valores a todos los miembros de la
estructura cada vez que quiera cambiar un dato como el precio o la
descripcion, estás generando un gran trafico adicional e innecesario entre
la clase y sus clientes (que puede traducirse en trafico de la red, si usas
Remoting o SOAP), estás obligando a la clase cliente a que reciba toda la
estructura para cambiar un dato, y a que la devuelva completa para
actualizarlo. Y estas impidiendo la posibilidad de agregar un simple miembro
de datos a la clase sin romper por completo su compatibilidad con todos los
componentes de código que la usen.

En suma, tu propuesta es una estupidez. Y tu manera de presentarla es aun
más estúpida. Y si la respuesta te parece agresiva, es porque eres muy
perspicaz.

¡Peste!


Leonardo
[MVP Visual Basic]
leonardo<arroba>mvps<punto>org

"El presente es una luz que palpita entre dos tinieblas"
- Naguib Mahfuz
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida