My favorites | Sign in
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
Implementacion_CADs  
Detalles de la implementación de los CADs de la Lógica de Negocio
Phase-Implementation, Featured
Updated Feb 4, 2010 by sergi.gi...@gmail.com

Introducción

En esta pequeña guía intentaremos dar los pasos a seguir para implementar el CAD de cada una de nuestras Entidades de Negocio

CADs

Los CADs están en el proyecto "Negocio", que contiene las ENs y los CADs, y probablemente contendrá también los Componentes de Proceso que se ofrecerán como servicio COM+.

Dentro de este proyecto, tenemos la carpeta "CAD", que tiene agrupadas los CADs por las 5 partes principales de la Lógica. Cada una de estas partes tiene su propio Namespace para agrupar cada sección.

Por norma general, los métodos implementados en cada EN devolverán hacia arriba siempre un DTO (o una colección de estos), mientras que las llamadas entre un EN y su CAD sí que podrán devolver ENs.

Uso de los TableAdapters

Para agilizar la implementación de las consultas a la BD, estamos utilizando los tableAdapters para las consultas sencillas. En caso de tener accesos más complejos a la BD, ya utilizaríamos un acceso más directo.

Pasos a tener en cuenta con los DataSets:

  • Configuramos la BD "Noticias" y le damos permiso de acceso a un usuario "web", con password "webnoticias". Estos datos están configurados en la cadena de conexión que se encuentra en Properties --> Settings.settings -> NoticiasConnectionString, por si necesitamos modificarlos, pero es preferible que todos compartamos la cadena de conexión, ya que este archivo está compartido en el repositorio.
  • Creamos un DataSet por desarrollador, dentro de la carpeta de nuestra sección asignada, excepto en el caso de Sigi y José Luis, que comparten carpeta, por lo que en esa habrá dos DataSets. Para ello, accedemos con el botón derecho -> añadir nuevo elemento -> Conjunto de Datos.
  • Con el DataSet vacío, nos conectamos a la BD en el Explorador de Servidores, y arrastramos la tabla con la que queramos trabajar al DataSet, para que nos cree el DataTable y TableAdapter correspondientes. En este momento nos preguntará qué conexión queremos usar, ya que detecta que el proyecto tiene configurada ya una cadena de conexión en las preferencias, que es la que debemos usar. El nombre de la conexión es "NoticiasConnectionString".

Una vez ya tenemos nuestra tabla configurada, ya podemos tener acceso a ella en el código del CAD. Para ello, lo primero que haremos será añadir una referencia como atributo privado en el CAD al TableAdapter, e incluir la referencia:

    using Negocio.CAD.Usuarios.UsuariosDataSetTableAdapters;

    public class CADLOG
    {
        private LogTableAdapter LogTableAdapter = new LogTableAdapter();
    }

TableAdapters

El TableAdapter ya nos proporciona por defecto los 4 métodos principales de acceso a los datos: SELECT, INSERT, UPDATE y DELETE, pero tendremos que hacer unas pequeñas modificaciones para que nos funcione mejor:

  • SELECT: el método GetData() nos devuelve directamente todos los registros, no es necesario modificarlo.
  • INSERT: el método Insert() hay que adaptarlo si la tabla tiene un identificador autonumérico, puesto que no nos va a devolver el Id que se ha generado y que necesitamos para actualizar nuestro EN. En caso de tener otro tipo de identificador, podemos utilizar directamente este método.

Para modificarlo, tendremos que agregar una nueva consulta de tipo Insert al TableAdapter (btn. derecho -> Agregar consulta...). Por defecto ya nos coloca la query correcta, y además nos añade la Select que nos devolverá el ID (podemos quitarle los campos que sobran). Guardamos el nuevo método generado, y en sus propiedades hay que cambiar el tipo de Ejecución ("ExecuteMode") a Scalar para que nos devuelva el Id.

  • UPDATE y DELETE: estos dos métodos sí que podemos utilizarlos, pero para que sean un poco más cómodos, les haremos una pequeña modificación:

Seleccionamos en el diagrama el TableAdapter que vamos a modificar, y en sus propiedades observamos que existe UpdateCommand y DeleteCommand. Si las desplegamos, podemos modificar el atributo CommandText, y observaremos que la Query que implementa iguala todos los atributos de la tabla. La cambiaremos y dejaremos solo el id = @id en el WHERE de la query. De esta manera, cuando invoquemos a los métodos, sólo será necesario pasarle el id al borrado, y los campos una sola vez en la modificación. Estos dos métodos devuelven el número de filas afectadas, por lo que bastará comprobar si es > 0 para saber si se ha modificado o eliminado un registro.

Para el resto de listados, iremos agregando consultas al TableAdapter conforme las vayamos necesitando.

Métodos

Los métodos originales se han generado también a partir de los diagramas de clases, con lo que sólo nos queda rellenarlos.

  • Los métodos del CRUD (Alta, Baja, Modificación y Load) devuelven un booleano y reciben la EN a actualizar.

Ejemplo de un método del CRUD:

        public bool alta(cLOG log)
        {
            bool retorno = false;
            int resultado = 0;
            try
            {
                if(log.Usuario == null)
                    resultado = (int)LogTableAdapter.AltaLog(log.IP, log.InfoAdicional, (int)log.TipoOperacion, log.FechaHora, null);
                else
                    resultado = (int)LogTableAdapter.AltaLog(log.IP, log.InfoAdicional, (int)log.TipoOperacion, log.FechaHora, log.Usuario.Usuario);
                if (resultado > 0)
                {
                    log.Id = resultado;
                    retorno = true;
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            return retorno;
        }

Cuidado con los atributos de tipo complejo, que hay que comprobar que no sean nulos para poder acceder a sus propiedades, como en el ejemplo anterior.

  • Los métodos que devuelven datos, siempre devolverán el DTO de la EN o colecciones de éste. Estos son el método de carga de datos ("dameUsuario()") y los listados.

Ejemplo de métodos que devuelven DTOs:

        public List<DTOLOG> listadoLogPorTipoOp(eTipoOperacion tipo)
        {
            List<DTOLOG> listado = null;

            try
            {
                UsuariosDataSet.LogDataTable data = LogTableAdapter.GetDataByTipo((int)tipo);
                if (data.Rows.Count > 0)
                {
                    listado = new List<DTOLOG>(data.Rows.Count);
                    foreach (UsuariosDataSet.LogRow fila in data.Rows)
                    {
                        cLOG l = new cLOG();
                        cargarEN(ref l, fila);
                        listado.Add(l.DTO);
                    }
                }
                data.Dispose();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return listado;
        }

En este ejemplo, rellenamos un listado de DTOs de LOG. La función cargarEN(ref l, fila); se encarga de hacer el mapeo relacional-EN. Es recomendable tener esta función en todos los CADs, porque se utilizará para la carga de datos en todos los listados.

Ejemplo de la función de mapeo:

        private static void cargarEN(ref cLOG log, UsuariosDataSet.LogRow fila)
        {
            log.Id = fila.id;
            if (!fila.IsipNull())
                log.IP = fila.ip;
            if (!fila.Isinfo_adicionalNull())
                log.InfoAdicional = fila.info_adicional;
            if (!fila.Istipo_operacionNull())
                log.TipoOperacion = (eTipoOperacion)fila.tipo_operacion;
            if (!fila.Isfecha_horaNull())
                log.FechaHora = fila.fecha_hora;
            if (!fila.IsusuarioNull())
                log.Usuario.load(fila.usuario);
        }

Para rellenar el listado, utilizamos directamente la Propiedad DTO de la EN para acceder a los datos, y así nos ahorramos la conversión.

Powered by Google Project Hosting