martes, 8 de marzo de 2016

NCapas Ado.Net 2


NCapas Ado.Net 2


Continuando con segunda parte del proyecto que no usa EntityFramWork como ORM si no que lo hemo uno mismo seguimos.
Esta segunda parte es la parte de Business Layer el cual solo realizare para una entidad del Proyecto ET(Entidades) en este caso de Usuario.

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL;
using ET;

namespace BL
{
    public class UsuarioBL
    {
       private UsuarioDAL usuarioDal = new UsuarioDAL();

        public List<Usuario> Listar()
        {
            return usuarioDal.Listar();
        }

        public Usuario GetById(int id)
        {
            Usuario usuario = usuarioDal.GetById(id);
            return usuario;
        }

        public bool Actualizar(Usuario usuario)
        {
            bool response = usuarioDal.Update(usuario);
            return response;
        }

        public bool Registrar(Usuario usuario)
        {
            bool response = usuarioDal.Registrar(usuario);
            return response;
        }

        public bool Eliminar(int id)
        {
            bool response = usuarioDal.Eliminar(id);
            return response;
        }

    }
}
Esta capa utiliza primer proyecto (DAL) que creamos esta clase realiza las operaciones basicas CRUD ya ustedes agregaran lo que haga falta esta solo es una guia.

Es siempre crearce un Test de unidad el cual garaniza que tus operaciones esten trabajando.

 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
using System;
using System.Configuration;
using System.Security.Cryptography;
using DAL.Dao;
using ET;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Business_Test
{
    [TestClass]
    public class UsuarioTest
    {
        [TestMethod]
        public void AddTest()
        {
            RolImpl rolImpl = new RolImpl();
            Rol rol = new Rol();
            rol.Id = 1;
            rol.Nombre = "nombre";
            bool result = rolImpl.Add(rol);
            Assert.AreEqual(true, result);
        }

        [TestMethod]
        public void DeleteTest()
        {
            RolImpl rolImpl = new RolImpl();

            bool result = rolImpl.Delete(8);
            Assert.AreEqual(true, result);
        }

        [TestMethod]
        public void ListTest()
        {
            RolImpl rolImpl = new RolImpl();

            var result = rolImpl.GetAll();

            Assert.IsTrue(result.Count > 0);
        }
    }
}


El resultado del test deberia ser el siguiente:




Anexo el proyecto en el siguiente Descargar

Si no les parece algo diganmelo asi tambien podre corregirlo. :) 


NCapas Ntier EntityFrameWork Generico 2


NCapas Ntier EntityFrameWork Generico 2


Business Layer
Esta es la segunda parte de un ejemplo NCapas y EntityFramework, para esto trabajaremos agregando un nuevo proyecto a la solucion en este caso la coloque como BL(Bussines Layer).
Por un lado tenemos las entidades de la DB en el proyecto Entity lo que queremos hacer es tener un CRUD de cada entidad crear uno a uno como que cansa y se vuelve tedioso por ello agrege un CRUD generico de entidades las cuales tambien podremos extenderlas con nuevos metodos una ves implementada.


Agregamos un interface generica que contiene las operaciones comunes entre las entidades.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace BL.crud {
 public interface IGenericBL < T > where T: class {
  IList < T > GetAll();
  T Find(Expression < Func < T, bool >> expresion);
  void Add(params T[] items);
  void Update(params T[] itemsy);
  void Remove(params T[] items);

 }
}
Creamos la clase GenericBL e implementamos la imterface creada, esta parte es interesante por que solo llamando al repositorio podemos realizar cualquier operacion CRUD


 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
using System.Linq.Expressions;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using System.Threading.Tasks;
using DAL.Dao;
using DAL.Generic;

namespace BL.crud
{
    public class GenericBl<T> : IGenericBL<T> where T : class
    {
        public GenericDataRepository<T> _repository;
      
        public GenericBl(GenericDataRepository<T> _repo)
        {
            _repository = _repo;
        }

       
        public void Add(params T[] items)
        {
           _repository.Add(items);
        }

        public IList<T> GetAll()
        {
            return _repository.GetAll();
        }

        public T Find(Expression<Func<T, bool>> expresion)
        {
            return _repository.Find(expresion);
        }

        public void Remove(params T[] items)
        {
            _repository.Remove(items);
        }

        public void Update(params T[] items)
        {
            _repository.Update(items);

        }
    }
}

Hasta aqui hemos concluido con crearnos una libreria generica para las operaciones basicas CRUD.
Ahora nos crearemos las clases de implementacion a nuestras entidades por ello que q llevaran el sufijo Imp, Ejm de una entidad Usuario.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BL.crud;
using DAL.Dao;
using DAL.Generic;
using Entity;

namespace BL.BlImp
{
    public class UsuarioImp: GenericBl<Usuario>
    {
        public UsuarioImp() : base(new UsuarioRepository())
        {
        }
    }
}

Esta es la clase concreta que invocaremos desde nuestra capa de presentacion esta clase podremos extenderla solo a nuevas operaciones de negocio que necesitemos.

NCapas Ntier EntityFrameWork 3

NCapas Ntier EntityFrameWork 

Capa de Presentacion

Para terminar esta presentacion, no estoy muy acostumbrado a usar Razor o por lo menos usarlo poco como ejm el layout y algunas cosillas simples,la idea es tratar de tener una aplicacion que responda a peticiones AJAX asi que en este ejm creare funciones basicas que devolveran Obj Json a traves de DTO's(Create Data Transfer Objects).

Creando el Layout

Este layout nos permite tener siempre cargados los archivos JS al final de nuestros HTML y no tener problemas de falta de un js no cargado, para ello usamos IsSectionDefined el cual nos permite si esta creado esa seccion agregarle algo en este caso el JS.


 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
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - Demo Test</title>
    <link href="~/Assest/css/web.css" rel="stylesheet" type="text/css" />
    <link href="~/Assest/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
    <script src="~/Assest/js/modernizr-2.6.2.js"></script>
</head>
<body>
    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                @Html.ActionLink("Demo Application", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                </ul>
            </div>
        </div>
    </div>

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    <script src="~/Assest/js/jquery-1.10.2.min.js"></script>
<script src="~/Assest/js/bootstrap.min.js"></script>
    @if (IsSectionDefined("jsFiles"))
    {
        @RenderSection("jsFiles");
    }

</body>
</html>

Ejemplo usando una seccion al final del html dentro del view HOME


 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
@{
    ViewBag.Title = "Home";
}

<h2>Usuario</h2>
<a href="~/home/editar">Nuevo Registro</a>
</br>
<table class="table table-striped">
    <thead>
        <tr>
            <td>Nombre</td>
            <td>Apellido</td>
        </tr>

    </thead>
    <tbody>
        @foreach (var usuario in Model)
        {
            <tr>
                <td>@usuario.Nombre</td>
                <td>@usuario.Apellido</td>
            </tr>
        }
    </tbody>
</table>
<div class="form-horizontal">
    <div class="form-group">
        <label class="control-label">Nombre</label>
        <input type="text" class="form-control" />
    </div>

    <div class="form-group">
        <label class="control-label">Apellido</label>
        <input type="text" class="form-control" />
    </div>
</div>
<div>
    <input id="btnReolad" type="button" class="btn btn-success" value="Cargar"/>
    <input type="button" class="btn btn-danger" value="Cancelar"/>
</div>

@section jsFiles
{
    <script type="text/javascript">
        $(function() {

            function loadEditUsuario() {
                $.ajax({
                    type: "POST",
                    url: "EditarJson",
                    data: {
                        "Nombre": "A1",
                        "Apellido": "A2",
                        "Id": 11
                    },
                    dataType: "Json",
                    success: function() {
                        console.log("exuito");
                    },
                    error: function() {
                        alert("Error");
                    },
                    complete: function() {
                        alert("complete");
                    }

                });
            }

            $("#btnReolad").click(
                function(event) {
                    loadEditUsuario();
                });
        })
    </script>
}

Controller HOME

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using BL.BlImp;
using Entity;

namespace WebAppEF.Controllers
{
    public class HomeController : Controller
    {
        private RolImpl rolImpl = new RolImpl();
        private UsuarioImp usuarioImp = new UsuarioImp();
        public ActionResult Index()
        {
            return View((List<Usuario>)usuarioImp.GetAll());
        }

        public ActionResult Editar(int idUsuario = 0)
        {
            ViewBag.Roles = rolImpl.GetAll();
            return View(idUsuario == 0 ? new Usuario() : usuarioImp.Find(x => x.id == idUsuario));
        }


        [HttpPost]
        public JsonResult EditarJson(Usuario usuario)
        {
            string message = "Success";
            return Json(message, JsonRequestBehavior.AllowGet);
        }


        [HttpPost]
        public JsonResult GetUsuariosJson(Usuario usuario)
        {
            var message= rolImpl.GetAll();
            return Json(message, JsonRequestBehavior.AllowGet);
        }
    }
}
Antes de crear la parte de la Capa de presentacion me cree un proyecto de Test el cual siempre es util cuando quieres probar un metodo nuevo  y poder testearlo, no esta de mas hacer algo de TDD. 

El proyecto completo lo podras obtener del siguiente enlace  Descarga





viernes, 4 de marzo de 2016

NCapas NTier con EntityFrameWork Generico

NCapas o NLayer

En esta oportunidad creare una demo de Ncapas haciendo uso de EntityFrameWork como en el primer Blog la capa de acceso tambien sera generica esto para evitar codigo repetido entre otras cosas.


ACCESO A DATOS

La estructura Nlayer es la siguiente




En esta primera parte realizaremos el Acceso a datos usando Entity FrameWork

ACCESO A DATOS

Las nuevas herramentas que van proveyendo las empresas de desarrollo para mapear una base de datos se ha vuelto comun en estos tiempos a ello lo denominan ORM's (Object Relational Mapping). Entity Framewok es una herramienta ORM el cual nos permite mapear una DB otros ejemplos son JPA e Hibernet dentro del mundo de JAVA ya ire publicando un proy Nlayer en java tambien.


Empecemos creando la estructura del proyecto MVC de la siguiente manera.








Seleccionamos un proyecto vacio y elegimos el check de MVC, elegimos vacio porque por lo menos por mi los demas generan basura y despues hay q limpiarlos.

Despues veremos de estructurar nuestro proy de MVC primero comenzaremos creado la estructura de las capas empezando con la de Acceso a datos.
Agregamos un proyecto de Classlibrary




Agregamos como un nuevo item de tipo Ado.Net EntityModel



Seleccionamos la Base de Datos




Seleccionamos la version de EF



Seleccionamos los objectos de la DB a usar en este caso las tablas no se olvide de desseleccionar la taba de diagrama la cual no necesitaremos y finializamos



Con esto crearemos un archivo .edmx el cual contiene un conjunto de archivos entre los caules esta en este caso ColegioModel.tt este archivo nos interesa ya que este contiene las entidades mapeadas y segun nuestro modelo debe star presente en todas las capas


Para que todas las entidades esten en todos los proyecto lo que debemos hacer es desvincular este archivo del proyecto y asignarlo a otro proyecto en nuestro caso el prory Entity


y quedara de la siguiente manera



Dos cosas importantes para que no se pierdan los vinculos de los archivos.
1. Cambiar la direccion de del archivo .edmx editanto el archivo ColegioModel.tt



2.- Cambiar el espacio de nombre al que esta asignado ColegioModel.tt en la propiedad del archivo ColegioModel.Context.tt



Realizamos el Build de los dos proyectos verifcando que no lancen excepciones.
No olvidarce  de referenciar el proyecto Entidades a todos los demas proyectos

Continuando crearemos la estructura para tener una clase generica de operaciones CRUD de todas las entidades.
Crearemos nuestra primera interface
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace DAL.Generic
{
    public interface IGenericDataRepository<T> where T : class
    {
        IList<T> GetAll();
        T Find(Expression<Func<T, bool>> where);
        void Add(params T[] items);
        void Update(params T[] items);
        void Remove(params T[] items);
    }
}

Implementando en la clase generica
 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
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Entity;

namespace DAL.Generic
{
    public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class
    {
        public virtual IList<T> GetAll()
            {
            List<T> list;
            using (var context = new ColegioEntities())
            {
                IQueryable<T> dbQuery = context.Set<T>();
                list = dbQuery.ToList<T>();
            }
            return list;
        }

        public virtual T Find(Expression<Func<T, bool>> where)
        {
            T item = null;
            using (var context = new ColegioEntities())
            {
                IQueryable<T> dbQuery = context.Set<T>();
                item = dbQuery.Where(where).ToList().FirstOrDefault<T>(); 
            }
            return item;
        }

        public void Add(params T[] items)
        {
            using (var context = new ColegioEntities())
            {
                foreach (T item in items)
                {
                    context.Entry(item).State = EntityState.Added;
                }
                context.SaveChanges();
            }
        }

        public void Update(params T[] items)
        {
            using (var context = new ColegioEntities())
            {
                foreach (T item in items)
                {
                    context.Entry(item).State = EntityState.Modified;
                }
                context.SaveChanges();
            }
        }

        public void Remove(params T[] items)
        {
            using (var context = new ColegioEntities())
            {
                foreach (T item in items)
                {
                    context.Entry(item).State = EntityState.Deleted;
                }
                context.SaveChanges();
            }
        }
    }
}

Esta clase generica tambien la podemos extender dentro la implemetacion de la clase concreta (repositorio) como ejemplo creamos un SP para una insercion de datos(solo ejm)
Ejm
 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL.Generic;
using Entity;

namespace DAL.Dao
{
    public interface IRolRepository: IGenericDataRepository<Rol>
    {
    }
    
    public class RolRepository : GenericDataRepository<Rol>, IRolRepository
    {
        public void InsertBySq(string nombre)
        {
            using (var context = new ColegioEntities())
            {
                context.sp_insert_rol(nombre);
                context.SaveChanges();
            }
            
        }
    }
}


Esta clase contrendra todas las operaciones CRUD que requerimos y adicionamente vemos un ejm tambien de llamada a un Store Procedure


Con esto terminamos la capa de acceso prox Cap agregare la capa de negocios la cual tb la la volveremos de tipo generica cosa que nos facilite tener que evitar de escribir mas codigo.

NCapas Generico Ado.Net


NCapas o NLayer



A lo largo de mi carrera he aprendido multiples lenguajes de programacion desde C standar hasta lenguajes de mas alto nivel en este caso de .Net. especificamente hablando de programacion con CSharp, y bueno me gustaria compartir con ustedes con un proyecto generico de NCapas o NLayers.
Comencemos.

ACCESP A DATOS

En este primero blog se implementara una aplicacion basada en ADO.Net y tiene la siguiente estructura.



Todas las capas usan el proyecto de Entidades que son nada mas que la represtacion de tablas de la base de datos en Clases




Usaremos una base de datos encontrada clasica que cualquiera puede crear.




Para generar la cadena de conexion solo hacemos un copy paste de la conexion que se puede hacer haciendo uso de Visual Studio..



Siguiendo los pasos de conexion a una DB por VS desplegamos la vista Server Explorer danlole click derecho y propiedades de la conexion podremos ver la cadena de conexion ya generada.

Guardamos la cadena de conexion generada para poderlo invocar desde el Configuration Manager
<?xml version="1.0" encoding="utf-8" ?>
<configuration>


  <connectionStrings>
    <add name="Colegio" providerName="System.Data.SqlClient" connectionString="Data Source=line2;Initial Catalog=Colegio;Integrated Security=True" />
  </connectionStrings>
</configuration>



Comezamos creando un proyecto ClassLibray denominado DAL (Data Access Layer) es nuestra capa base de conexion a la Base de datos y creamos la estructura de directorios DAO, Genero y Utils esto para tener agrupado nuestras clases en un debido nameSpace.
Las  clases iniciales a crear son las encontradas en Generic


Iniciamos creando la interface IDataAccess la cual abstrae la logica de conexion y obtencion de registros.

using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace DAL.Generic
{
    public interface IDataAccess
    {
        SqlDataReader GetReader(string sql, List<SqlParameter> listParam= null );
        object GetScalar(string sql, List<SqlParameter> listParam = null);

        DataSet GetDataSet(string sql, List<SqlParameter> listParam = null);

        int ExecuteNonQuery(string sql, List<SqlParameter> listParam = null, bool isTransaction = false, CommandType commandType = CommandType.Text);

    }
}

Implementado la interface en nuestra clase DaoTemplate esta clase nos proveera las herramientas basicas de obtension de registros desde la DB.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace DAL.Generic
{
    public class DaoTemplate : IDataAccess
    {

        private SqlConnection GetConetion()
        {
            SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.AppSettings["Colegio"].ToString());
            return sqlConnection;
        }

        public SqlDataReader GetReader(string sql, List<SqlParameter> parameters = null)
        {
         
            }
        }

        public object GetScalar(string sql, List<SqlParameter> parameters = null)
        {
            SqlConnection conn = this.GetConetion();
      
            }
            return obj;
        }

        public DataSet GetDataSet(string sql, List<SqlParameter> listParam = null)
        {
            SqlConnection conn = this.GetConetion();
         
            return ds;
        }

        public int ExecuteNonQuery(string sql, List<SqlParameter> listParam = null, bool isTransaction = false, CommandType commandType = CommandType.Text)
        {
            
            {
                throw;
            }
            return res;
        }
    }
}

El siguiente paso es crear nuestra interface de operaciones CRUD(Create Read Update Delete) o tambiem llamado ABM. en el cual abstraemos las operacions basicas de una entidad

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
using System.Collections.Generic;

namespace DAL.Generic
{
    public interface IBaseCrud<Entity, Key>
    {
        List<Entity> GetAll();
        Entity GetById(Key id);
        bool update(Entity entity);
        bool Add(Entity entity);
        bool Delete(Key value);
    }
}



Donde
Entidy es la entidad generica que queremos implementar CRUD
Key es la tipo de la llave primaria de nuestro mapeo de DB por lo general es entero pero en otras ocaciones es de tipo string. Haciendo uso de DaoTemplate podemos crear las operacion basicas, se opto por usar Procedimientos Almacenados es decir q en toda operacion se invocaran mediante procedimientos almacenados.
Haremos uso de un Mapeador de propiedades y tambien uso de Constantes prefijas
Ejm   sp_sel_[NombreEntidad]
          sp_ins_[NombreEntidad]
          sp_del_[NombreEntidad]


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
83
84
85
86
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using DAL.Utils;

namespace DAL.Generic
{
    public class BaseCrud<Entity, Key> : IBaseCrud<Entity, Key>
    {
        private DaoTemplate daoTemplate;
        private MapperEntity<Entity> mapper;
        public string Pkey { get; set; }


        public BaseCrud()
        {
            daoTemplate = new DaoTemplate();
            mapper = new MapperEntity<Entity>();
        }
        public bool Add(Entity entity)
        {
            string strSql = AppConst.SP_INSERT + typeof(Entity).Name.ToLower() + " ";

            List<SqlParameter> sqlParameters = new List<SqlParameter>();

            Dictionary<string, object> columns = mapper.ParamentersFromEntity(entity, Pkey);

            foreach (var column in columns)
            {
                SqlParameter param = new SqlParameter(column.Key, column.Value);
                sqlParameters.Add(param);
            }

            int result = daoTemplate.ExecuteNonQuery(strSql, sqlParameters, false, CommandType.StoredProcedure);

            return result > 0 ? true : false;
        }

        public bool Delete(Key value)
        {
            string strSql = AppConst.SP_DELETE + typeof(Entity).Name.ToLower() + " ";
            List<SqlParameter> sqlParameters = new List<SqlParameter>();
            SqlParameter param = new SqlParameter(Pkey, value);
            sqlParameters.Add(param);
            int result = daoTemplate.ExecuteNonQuery(strSql, sqlParameters, false, CommandType.StoredProcedure);

            return result > 0 ? true : false;
        }

        public List<Entity> GetAll()
        {
            string strSql = AppConst.SP_SELECT + typeof(Entity).Name.ToLower() + " ";
            
            DataSet result = daoTemplate.GetDataSet(strSql, null);

            return DataTablesToList.ConvertDataTable<Entity>(result.Tables[0]);
        }

        public Entity GetById(Key id)
        {
            throw new NotImplementedException();
        }

        public bool update(Entity entity)
        {
            throw new NotImplementedException();
        }

        private List<SqlParameter> GetParameters(Entity entity)
        {
            List<SqlParameter> lstParameters = new List<SqlParameter>();

            foreach (var propertyInfo in entity.GetType().GetProperties())
            {
                var name = propertyInfo.Name;
                Object value = propertyInfo.GetValue(this, null);
                SqlParameter param = new SqlParameter(name, value);
                lstParameters.Add(param);
            }
            return lstParameters;
        }

    }
}

Hasta aqui hemos creado la clase generica para nuestras entidades procederemos a implementar una de ellas para ello haremos el uso del proyecto de Entidades q son la representacion del modelo de la DB en clases.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DAL.Generic;
using ET;

namespace DAL.Dao
{
    public class RolImpl: BaseCrud<Rol, int>
    {
        public RolImpl()
        {
            this.Pkey = "Id";

        }
    }
}

La clase la llamaremos RolImpl (como Rol Implementacion) esta clase al heredar de BaseCrud contedra las operaciones CRUD, ademas de ello aca podemos extender en nuevos metodos para complementar algun tipo de operacion,
las demas implementaciones a las entidades las puedes crear tu mismo ya que ahora resulta completamente sencillo implementar un crud solamente heredando de BaseCrud.

Con esto finalizamos la primera parte de Acceso a Datos generico usando tencnologia ADO.Net