C sharp - C# tres capas

 
Vista:
Imágen de perfil de Jose
Val: 15
Ha aumentado su posición en 5 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C# tres capas

Publicado por Jose (3 intervenciones) el 26/05/2018 08:21:14
Hola a todos, estoy empezando a trabajar con C# en tres capas. Tengo el siguiente ejemplo y me funciona correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//Una de las clases de la capa modelo
using System.Data;
using System.Data.SqlClient;
 
namespace Capas3.modelo
{
    class UsuariosModelo
    {
        SqlConnection conexion;
        SqlDataAdapter adaptador;
        DataTable tblUsuarios;
 
        public DataTable GetUsuarios()
        {
            conexion = new SqlConnection(ConexionBase.Conectar());
            adaptador = new SqlDataAdapter("select * from usuarios", conexion);
            tblUsuarios = new DataTable();
 
            conexion.Open();
            adaptador.Fill(tblUsuarios);
            conexion.Close();
 
            return tblUsuarios;
        }
    }
}
 
//una clase de la capa de negocio
using System.Data;
using Capas3.modelo;
 
namespace Capas3.negocio
{
    class UsuariosNegocio
    {
        public DataTable GetUsuarios()
        {
            UsuariosModelo usuariosModelo = new UsuariosModelo();
            return usuariosModelo.GetUsuarios();
        }
    }
}
 
//una clase de la capa de presentacion
using System;
using System.Windows.Forms;
using Capas3.negocio;
 
namespace Capas3.formulario
{
    public partial class FrmUsuario : Form
    {
        public FrmUsuario()
        {
            InitializeComponent();
        }
 
        private void FrmUsuario_Load(object sender, EventArgs e)
        {
            UsuariosNegocio usuariosNegocio = new UsuariosNegocio();
            dgvUsuarios.DataSource = usuariosNegocio.GetUsuarios();
        }
    }
}

Bien, mi pregunta es va la cosa por buen camino ? si estoy aplicando bien el concepto en tres capas? si se pudiera aplicar mejor el concepto de tres capas como lo harían... Les agradezco.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

C# tres capas

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 27/05/2018 02:00:04
Si has empezado a trabajar así, seguramente debes tener los conceptos claros, ya que no te podríamos decir si tienes o no claro los conceptos al respecto.

Según como has mostrado tu código, la organización del proyecto está aceptable, algunas cositas que ajustar, pero no creo que sean como para no poderlos corregir, recuerda que tienes que evaluar el escenario donde vas a trabajar, si el caso lo amerita o no.

Ahora, imagino que estás trabajando todo orientado a objetos, y si la respuesta es sí, no veo por ejemplo tu clase usuario, ya que lo único que has mostrado es un select * a una tabla y te devuelve un datatable, piensas trabajar así con datatables todo el proyecto?.

Si necesitas un solo usuario, crees que un datatable realmente represente a una entidad usuario?.

Claro que estas cosas ya no tienen que ver directamente con tu pregunta, pero si tiene que ver con todo el contexto de tu proyecto.

Seguramente te darán mas opiniones al respecto.

Si tienes cualquier otra duda al respecto, nos lo haces saber.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jose Sepulveda Velez
Val: 15
Ha aumentado su posición en 5 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C# tres capas

Publicado por Jose Sepulveda Velez (6 intervenciones) el 05/06/2018 14:37:49
Gracias por tu comentario. Fíjate que el proyecto anterior era una solución de Windows forms. En el cual le agregaba tres capetas: negocio, datos y presentación. Estuve mirando en este blog: http://joseluisgarciab.blogspot.com/2014/09/programacion-en-3-capas.html y estuve practicando con este ejemplo, ya tengo más claro como es la programación por capas. De nuevo muchas gracias y si tienes algún ejemplo o url lo agradecería.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Manuel F.
Val: 63
Ha disminuido 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C# tres capas

Publicado por Manuel F. (33 intervenciones) el 05/06/2018 07:06:57
Muy buenas noches a todos !!!

Estoy de acuerdo con Wilfredo... Tienes claro el concepto básico de la programación por capas, ahora creo, que estás realizando las capas basándote solo en clases diferentes pero dentro de un mismo namespace (o sea un mismo proyecto), también vale ...
Ahora, yo tengo cierto tiempo (no demasiado) trabajando con capas, y curioseando por videos, tutoriales y demás material de apoyo, tomé lo mejor y más funcional y eficiente del material de aprendizaje que pude observar y seguir, y los combiné para lograr un esquema de capas que me ha resultado (no he descubierto nada nuevo,lo que hice fue recopilar y combinar) y entonces trabajo de acuerdo a la siguiente estructura:
1) Un proyecto principal [Aplicación Windowsform]: El que contiene el(los) form(s) por la cual el usuario hará el "contacto directo" (uso) de la aplicación. Esta sería lo que se llamaría Capa Presentación...
2) Dentro de la misma solución, agrego un nuevo proyecto [tipo Biblioteca de Clases], la cual se encargaría del manejo de la Base de Datos dentro de una Clase que contendrá 3 métodos: Conexión con la BD, Desconexión de la BD y Ejecución de Procedimientos Almacenados (Stored Procedure), este último es un método genérico para ejecutar dichos procedimientos (todos). Esta sería la Capa de Acceso a Datos...
3) Agrego un 3er proyecto [tipo Biblioteca de Clases]: Que contendrá todos los parámetros que van a ser utilizados por la aplicación. Sería la Capa Parámetros...
4) Un 4to proyecto [tipo Biblioteca de Clases]: Formado por las Clases que contendrán los diversos métodos como Búsqueda, Inserción, Actualización, Eliminación, etc. Esta sería la capa Capa Lógica de Negocios...

En donde, el Proyecto principal Capa Presentación tendría de referencia a la capa Lógica de Negocios, éste, a su vez tendría de referencia a la Capa de Acceso a Datos y a la Capa Parámetros.
Por último, Capa de Acceso a Datos tendría referencia también a la Capa Parámetros.

El esquema que describí antes, es para una aplicación de escritorio. En caso de ser una app del tipo web services, se incluiría un proyecto adicional (otra capa) del tipo Web ASP.Net, combinado con un Servicio WCF, pero eso es otro tema...

Ese, se ha convertido en mi esquema de trabajo con capas. Me ha resultado bastante bien...
A ver que opinan uds... Y amigo Wilfredo, si tienes alguna(s) sugerencia(s), concejo(s) y/o corrección(es) para este esquema que describí, te lo agradecería mucho...!!!



Saludos...!!!

Manuel F. Borrego Sterling
Puerto La Cruz, Edo. Anzoátegui. Venezuela.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jose Sepulveda Velez
Val: 15
Ha aumentado su posición en 5 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C# tres capas

Publicado por Jose Sepulveda Velez (6 intervenciones) el 05/06/2018 15:09:46
Gracias por tu comentario Manuel, precisamente estuve mirando en este blog: http://joseluisgarciab.blogspot.com/2014/09/programacion-en-3-capas.html e hice el ejemplo que ahí está. Es parecido a que lo mencionas:

- Un proyecto en blanco
- Se agrega biblioteca de clases: Datos
- Se agrega biblioteca de clases: Negocio
- Se agrega biblioteca de clases: Presentación
- Se agrega biblioteca de clases: Entidad (según el ejemplo no es otra capa, sino un complemento a la capa de datos)

Con el ejemplo que muestra en ese blog me queda algo más claro, pero aun asi si tienes algún material o url te agradezco.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 707
Oro
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

C# tres capas

Publicado por Wilfredo Patricio Castillo (416 intervenciones) el 05/06/2018 16:55:51
Hola Manuel.

Si ya trabajas así, pues no soy autoridad en el asunto, pero lo único que te podría decir es que si has visto el ejemplo del que menciona José Sepúlveda, si te fijas en la capa de acceso a datos, las conexiones se abren justo cuando se necesita y se cierran.

Por lo tanto el uso del using es muy importante en estos casos, hacerlo de otra manera tienes el inconveniente de cerrarlo explícitamente. Ahora que pasa si se presenta una excepción en tu caso?, si ya no llegas a la parte de cerrar la conexion se queda abierta?.

Te recomiendo usar el using de preferencia.

La capa de parámetros que mencionas imagino que debe ser la capa de entidades que tiene José.

Recuerda que la capa lógica de negocios, no es solamente tener una clase con métodos buscar o insertar como lo mencionas, sino que justamente se llama lógica de negocio, porque alli es donde se deben aplicar todas las reglas del negocio y no quedar como simples métodos o funciones, sino que deben tener la lógica que el negocio requiere, sino, no tendría sentido y menos llamas lógica de negocio.

Ahora según lo dicho, dentro del using de la conexion, viene el Command, y sería allí donde coloques tu sentencia a ejecutar o tu Procedimiento almacenado.

No entendí la parte que dice que lo haces genérico, ya que si haces que la aplicación haga reflexión u otro tipo de descubrimiento, lo estás esforzando creo que en vano, salvo mejor parecer.

Ahora que si no quieres hacer todo ese trabajo, también podrían usar Entity Framework, el cual se encargaría de generar la capa de entidades, y aplicar por ejemplo un patrón repository para el acceso a datos con lo cual, les aliviaría muchísimo trabajo y ustedes solo se centrarían en la lógica del negocio, pero eso también es de acuerdo a las necesidades del proyecto, no se puede aplicar a rajatabla EF o ADO.NET puro, así que tengan presente eso y si les alivia la carga de trabajo y les hace mas productivos, habría que considerarlo.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Manuel F.
Val: 63
Ha disminuido 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C# tres capas

Publicado por Manuel F. (33 intervenciones) el 07/06/2018 06:59:47
Muy buenas noches...!!!

Wilfredo, en cuanto a lo que mencionaste, sobre el uso de los "using" y la apertura y cierre de la conexión, con la Base de Datos, tienes toda la razón, y de paso creo que no supe explicarme bien... Si bien es cierto que no he utilizado el "using"... Te doy una muestra (y para el amigo José Sepúlveda, también por supuesto), del código de la Capa Acceso a Datos que uso.

También, referente a lo que mencioné anteriormente, un método "genérico" (por decirlo así), para ejecutar los Stored Procedures...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public class Administrador
{
    public FbConnection conexion;
    readonly string path = @"C:\Visual Studio\VS2017\C#\Prácticas\App's De Negocios\MTMSoftwareElects\MTMElectronics.fdb";
    string stringConexion;
 
    public void AbrirConexion()
    {
        stringConexion =
                "ServerType=0;" +
                "User=SYSDBA;" +
                "Password=********;" +
                "Packet Size=16384;" +
                "Dialect=3;" +
                "Pooling=false;" +
                "Database=" +
                path;
        conexion = new FbConnection(stringConexion);
 
        if (conexion.State == ConnectionState.Closed)
        {
            conexion.Open();
        }
    }
 
    public void CerrarConexion()
    {
        if (conexion.State == ConnectionState.Open)
        {
            conexion.Close();
        }
    }
 
    // Método para ejecutar "Store Procedure" (Insert, Delete, Update)...
    public void Ejecutar_SP(string nombreSP, List<Parametros> lista)
    {
        FbCommand cmd;
 
        try
        {
            AbrirConexion();
            cmd = new FbCommand(nombreSP, conexion)
            {
                CommandType = CommandType.StoredProcedure
            };
 
            if (lista != null)
            {
                for (int i = 0; i < lista.Count; i++)
                {
                    if (lista[i].Direccion == ParameterDirection.Input)
                    {
                        cmd.Parameters.AddWithValue(lista[i].Nombre, lista[i].Valor);
                    }
 
                    if (lista[i].Direccion == ParameterDirection.Output)
                    {
                        cmd.Parameters.Add(lista[i].Nombre, lista[i].TipoDato, lista[i].Tamaño).Direction = ParameterDirection.Output;
                    }
                }
                cmd.ExecuteNonQuery();
 
                // Recuperar parámetros de salida...
                for (int i = 0; i < lista.Count; i++)
                {
                    if (cmd.Parameters[i].Direction == ParameterDirection.Output)
                    {
                        lista[i].Valor = cmd.Parameters[i].Value.ToString();
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            CerrarConexion();
        }
    }
}


Como deben haber visto, al hacer el llamado al método EjecutarSP(string nombreSP, List<Parametros> lista), en éste, dentro de un "try-catch-finally" abre la conexión, ejecuta el SP y al terminar la cierra (aún si ocurre una excepción controlada)...
Hablé de que (en mi opinión) se trata de un método genérico, porque puedo con él, ejecutar cualquier SP, independientemente de la cantidad y tipo de parámetros (de salida o de entrada) que el SP contenga. Esto es, porque en el "List" lo declaro tipo 'Parametros' (de la Capa Parámetros o Entidad si se prefiere, el complemento de la Capa Acceso a Datos), y por ella hago el envio de los parámetros de consulta para un SP determinado. No se si me expliqué bien, espero en DIOS que si...

También les coloco aquí, la Capa Parametros (Entidad), que contiene como ya dije, los parámetros (de forma general) de la app, así como 2 Constructores uno para los parámetros de entrada, y el otro para los de salida...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Parametros
{
    // Los parámetros de la clase...
    public String Nombre { get; set; }
    public Object Valor { get; set; }
    public FbDbType TipoDato { get; set; }
    public Int32 Tamaño { get; set; }
    public ParameterDirection Direccion { get; set; }
 
    // CONSTRUCTORES...
    // Construc.Entrada...
    public Parametros(string objNombre, object objValor)
    {
        Nombre = objNombre;
        Valor = objValor;
        Direccion = ParameterDirection.Input;
    }
 
    // Construc.Salida...
    public Parametros(string objNombre, FbDbType objTipoDato, Int32 objTamaño)
    {
        Nombre = objNombre;
        TipoDato = objTipoDato;
        Tamaño = objTamaño;
        Direccion = ParameterDirection.Output;
    }
}

Ojalá se vean claros (la explicación, me refiero). Y en cuanto al tratamiento de la capa Lógica de Negocios, tienes toda la razón, la estaba tratando si se quiere muy "simplonamente", y de seguro eso me iba a llevar a serios dolores de cabeza. Ya estoy empezando a "ordenar y limpiar el cuarto" como dicen...


Saludos...!!!



Manuel F. Borrego Sterling

PD: Se me olvidaba... Los prefijos "Fb" por ejemplo de los objetos "FbConnection", "FbCommand" y "FbDataType", se debe a que hago uso de la BD FirebirdSQL (de la Compañía Interbase)...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar