Ir al contenido principal

Crear Web API en ASP.NET con ADO.Net usando Visual Studio 2019 - Fase I

Hola nuevamente espero estén todos bien, en el anterior articulo acerca de la Creación de Web API con C# y EF, inicialmente detallamos acerca de la arquitectura a nivel de despliegue e interacción entre los 4 componente de la infraestructura (On-Premise) que lo conforman. 

En este nuevo articulo veremos la creación e implementación de Web API con C# y ADO.Net, antes de iniciar con el desarrollo o elaboración, mencionar que la arquitectura a implementar será Arquitectura N-Capas Orientada al Dominio.

Las principales bondades de trabajar en capas son las agrupaciones horizontales lógicas de los componentes de tecnología que lo conforman la aplicación o el servicio. Es decir nos ayudan a diferenciar entre los diferentes tipos de tareas a realizar cada componente, todo esto nos ofrece o conlleva a un diseño que maximiza la reutilización y mantenibilidad en el código fuente y despliegue de nuestra aplicación.
Recordemos que la Arquitectura orientado a N-Capas (N-Layer) sólo se concentra en la separación de la lógica de aplicación o programa, no confundamos con la arquitectura 3-Niveles (3-Tiers).
Otras de las bondades es, sin lugar a duda se trata de aplicar el Principio de Separación de Responsabilidad (SoC - Separation of Concerns Principle) dentro de la Arquitectura Orientada al Dominio. 

En esta Fase I veremos acerca de la tabla de base de datos, creación de los proyectos, entidad y atributos e implementaremos el método listar con datos definido en el mismo programa - WEB API. Bueno, sin mayores detalle iniciamos la parte práctica.

Lo que veremos en este articulo:

  • Requisitos para nuestro ejemplo práctico.
  • Paso 1: Detalle de base de datos.
  • Paso 2: Crear el proyecto WebApi.
  • Paso 3: Crear e implementar el proyecto Models.
  • Paso 4: Crear e implementar el proyecto Data.Access.
  • Paso 5: Crear e implementar el proyecto WebApi.Data.Business.
  • Paso 6: Crear e implementar el proyecto WebApi.Domain.
  • Paso 7: Implementar el Proyecto WebApi.
  • Paso 8: Testear el método "ListUsers" desde Postman.
  • Conclusión.

Requisitos para nuestro ejemplo práctico:

  1. Microsoft Visual Studio Community 2019
  2. .Net Framework 4.6
  3. ADO.Net (tecnología para la conexión a datos)
  4. Microsoft SQL Server 2017 Express
  5. Postman
Para este ejemplo práctico veremos el proceso del ya conocido CRUD, para lo cual haremos uso de la base de datos que se implemento en el articulo "CRUD - Base de Datos con Microsoft SQL Server 2019", ademas crearemos cinco proyectos y finalmente testeamos la API desarrollada desde el Postman.

Paso 1: Detalle de base de datos:

La base de datos es BD_TEST y tabla USUARIO que esta conformado por los siguientes campos:
USE BD_TEST
GO
CREATE TABLE dbo.USUARIO(
       Id int IDENTITY(1,1) NOT NULL,
       usuario varchar(50) NOT NULL,
       contrasena varchar(250) NOT NULL,
       intentos int NOT NULL,
       nivelSeg decimal(18, 0) NOT NULL,
       fechaReg date NOT NULL
)
GO
ALTER TABLE dbo.USUARIO ADD  CONSTRAINT PK_USUARIO PRIMARY KEY (id), CONSTRAINT DF_Usuario_fechaReg  DEFAULT (getdate()) FOR fechaReg

Paso 2: Crear el proyecto WebApi:

Ingresar al Microsoft Visual Studio Community 2019 y crear el proyecto de tipo Aplicación web ASP.Net (.NET Framework) con el nombre de ArquitecturaWebApi  con la versión .NET Framework 4.6:
Buscar y seleccionar el proyecto de tipo Aplicación web ASP.Net (.NET Framework) y clic en siguiente.

Ingresamos el nombre, la ubicación y seleccionar la versión del Framework y clic en Crear

Seleccionar el de tipo API web y clic en Crear

Paso 3: Crear e implementar el proyecto Models:

Luego creamos el proyecto de tipo Biblioteca de clases (.NET Framework) con el nombre de ArquitecturaWebApi.Models con la versión .NET Framework 4.6 (las 2 imágenes siguientes se debe repetir los mismo pasos para los proyectos Data.Access, Data.Business y Domain):
Seleccionar el tipo de proyecto de Biblioteca de clases (.NET Framework) y clic en Siguiente

Asignar nombre, ubicación y seleccionar Framework y clic en Crear

Además agregar la clase de entidad UsuarioModel (para mantener el principio de SoC creamos el directorio Usuario y dentro de ello creamos la clase) con los siguientes atributos:
Clic derecho en el directorio, seleccionar Agregar/Nuevo elemento

Atributos que lo conforman la clase de entidad UsuarioModel:
namespace ArquitecturaWebApi.Models.Usuario
{
    public class UsuarioModel
    {
        public int id { get; set; }
        public string usuario { get; set; }
        public string contrasena { get; set; }
        public int intentos { get; set; }
        public decimal nivelSeg { get; set; }
    }
}
Hasta aquí ya se a creado nuestra entidad de datos, con el fin de hacer la referencia a la tabla USUARIO de nuestra base de datos BD_TEST, por ahora no se está considerando el campo fechaReg (esta por defecto para capturar la fecha actual de servidor de base de datos)

Paso 4: Crear e implementar el proyecto Data.Access:

Ahora creamos el proyecto de tipo Biblioteca de clases (.NET Framework) con el nombre de ArquitecturaWebApi.Data.Access con la versión .NET Framework 4.6 (se considera los pasos de las 2 imágenes iniciales del poryecto Models):

Seguidamente referenciamos al proyecto ArquitecturaWebApi.Models para acceder a los atributos de nuestra entidad UsuarioModel, por ahora sólo implementaremos un método de tipo IEnumerable para devolver una interfaz enumerada de solo de lectura (nombre ListUsers) y listaremos datos definidos en el en mismo programa (aún no se establece la conexión a la base de datos):
//Importar para acceder al poryecto Models y directio Usuario
using ArquitecturaWebApi.Models.Usuario; 
namespace ArquitecturaWebApi.Data.Access.DAL
{
    public class UsuarioDAL
    {
        public static IEnumerable<UsuarioModel> ListUsers()
        {
            //Referanciamos a la entidad UsuarioModel
            UsuarioModel[] resultUsers = new UsuarioModel[]
            {
            new UsuarioModel { id = 1, usuario = "HADSON", contrasena = "tuh0L@1234", intentos = 5, nivelSeg = 5},
            new UsuarioModel { id = 2, usuario = "CESAR01", contrasena = "Ce$ar1234", intentos = 5, nivelSeg = 5}
            }; 
            return resultUsers;
        }
    }
}

Paso 5: Crear e implementar el proyecto WebApi.Data.Business:

Ahora crearemos el proyecto de nombre ArquitecturaWebApi.Data.Business, también de tipo Biblioteca de clases (.NET Framework) con el .NET Framework 4.6 (se considera los pasos de las 2 imágenes iniciales del poryecto Models):

Seguidamente referenciamos los proyectos ArquitecturaWebApi.ModelsArquitecturaWebApi.Data.Access para acceder a la entidad UsuarioModel y creamos el método ListUsers que invoca al método ListUsers del proyecto ArquitecturaWebApi.Data.Access para listar la interfaz enumerada de solo de lectura:
//Importar los poryectos Models y Data.Access, para acceder al directio Usuario y DAL
using ArquitecturaWebApi.Models.Usuario;
using ArquitecturaWebApi.Data.Access.DAL;

namespace ArquitecturaWebApi.Data.Business
{
    public class Usuario
    {       
        public static IEnumerable<UsuarioModel> ListUsers()
        {
            try
            {
                //Retornamos la lista de valores del método ListUsers() que invocamos
                return UsuarioDAL.ListUsers();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}

Paso 6: Crear e implementar el proyecto WebApi.Domain:

Para ya ir finalizando esta Fase I acerca de la tabla y creación de los proyectos, crearemos el último proyecto de nombre ArquitecturaWebApi.Domain, también de tipo Biblioteca de clases (.NET Framework) con el .NET Framework 4.6 (se considera los pasos de las 2 imágenes iniciales del poryecto Models):

Seguidamente referenciamos los proyectos ArquitecturaWebApi.Models y ArquitecturaWebApi.Data.Business para acceder a la entidad UsuarioModel y creamos el método ListUsers que invoca al método ListUsers del proyecto ArquitecturaWebApi.Data.Business para listar la interfaz enumerada de solo de lectura:
//Importar para acceder al proyecto Models y directio Usuario, adempas importar el proyecto Data.Business
using ArquitecturaWebApi.Models.Usuario;
using ArquitecturaWebApi.Data.Business;

namespace ArquitecturaWebApi.Domain
{
    public class UsuarioDomain
    {
        public IEnumerable<UsuarioModel> ListUsers()
        {
            try
            {//Invocamos al método listar de la capa negocio "Data.Business"
                return Usuario.ListUsers();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}

Paso 7: Implementar el Proyecto WebApi:

Para finalizar implementaremos en nuestro proyecto ArquitecturaWebApi con 2 métodos con el fin de verificar y testear el correcto funcionamiento de lo desarrollado hasta ahora.

Seguidamente crear el controlador UsuarioController, clic derecho en directorio Controllers y seleccionar agregar\controlador y crear los métodos Get() y Get(int id):
Seleccionar Controlador de Web API 2 con acciones de lectura y escritura y clic en Agregar 

Asignar nombre Usuario.... (la palabra Controller es parte del estándar de MVC) y clic en agregar

Importar los proyectos ArquitecturaWebApi.Models y ArquitecturaWebApi.Domain, luego invocar al método ListUsers, y finalizamos con la implementación de los siguientes métodos Get() y Get(int id):

//Importar los proyectos
using ArquitecturaWebApi.Models.Usuario;
using ArquitecturaWebApi.Domain;

namespace ArquitecturaWebApi.Controllers
{
    public class UsuarioController : ApiController
    {
        UsuarioDomain usuarioDomain = new UsuarioDomain();

        /// <summary>
        /// GET: api/Usuario (retorna toda la lista)
        /// </summary>
        /// <returns></returns>
        [ResponseType(typeof(IEnumerable<UsuarioModel>))]
        public IEnumerable<UsuarioModel> Get()
        {
            return usuarioDomain.ListUsers().ToArray();
            //return users;
        }

        /// <summary>
        /// GET: api/Usuario/5 (retorna los valores de un sólo registro según el valor id)
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public IHttpActionResult Get(int id)
        {
            var usuario = usuarioDomain.ListUsers().ToArray().FirstOrDefault((p) => p.id == id);
            //var usuario = users.FirstOrDefault((p) => p.id == id);
            if (usuario == null)
            {
                return NotFound();
            }
            return Ok(usuario);
        }
    }
}
Recuerden antes de importar los proyecto Models y Domain se debe agregar la referencia

Paso 8: Testear el método "ListUsers" desde Postman:

Para esto debemos establecer como proyecto de inicio al proyecto ArquitecturaWebApi y seguidamente ejecutar la aplicación; desde Postman selecionamos Get y ingresamos la ruta https://localhost:44336/api/Usuario o https://localhost:44336/api/Usuario/1 (pueden lograr el mismo resultado desde el mismo browser):

Resultado https://localhost:44336/api/Usuario

Resultado de https://localhost:44336/api/Usuario/1

Conclusión:

Como mencione en el anterior articulo acerca de las Web Api, en definitivo no es complicado de implementar, y la flexibilidad que nos ofrece y su principal ventaja que reside en la independencia que proporciona frente a cualquier aplicación que la puede consumidor, sin embargo en este articulo quería dar por iniciado acerca de la implementación de Web Api usando una arquitectura en capas e ir dando algunas pinceladas (solo se detallo las características de la tabla) a nivel base datos con el fin de aplicar ADO.Net. 
Como siempre gratitud a Dios por todo, y nuevamente agradecerles de antemano por la revisión y lectura de este nuevo articulo, nos vemos en el Fase II.

Comentarios

Entradas más populares de este blog

Habilitar Usuario HR Oracle

Al realizar la primera instalación del Oracle, el usuario HR por defecto está bloqueado y por ende no podemos loguearnos como dicho usuario, lo que debe hacer son los siguiente pasos, aplicables para Linux o Windows.
1. Conectarse como usuario system o sysdba + contraseña haciendo uso del comando connect.
Usuario: system
Password: xxxx 


2. Hacer uso  del comando alter user hr account unlock desbloqueamos la cuenta.
alter user hr account unlock;

3. Escribimos el comando alter user HR identified by hr; con esto estamos diciendo que la contraseña será hr.

alter user HR identified by hr;

4. Ahora testeamos la conexión con el comando - conn hr/hr@xe. Si deseas después de conectarnos se puede realizar un select a la tabla employees del hr.


Resultado del select realizado
5. Con todos estos pasos realizados ya podemos logearnos desde cualquier IDE como el usuario hr  y la contraseña hr que definimos en el paso 3. 
Para finalizar nos loguearemos con el IDE Oracle SQL Developer.

Espero les sea de utilidad,…

Usuario SYS y SYSTEM - ORACLE

Usuario SYS y SYSTEM
Ambos usuario son creados de forma automática al crear la base de datos ORACLE y se otorga el rol de DBA.

SYS (password por defecto: CHANGE_ON_INSTALL).
SYSTEM (password por defecto: MANAGER).

Lo que se recomienda es cambiar el password de ambos usuarios por el tema de seguridad.

SYS:
Todas las tablas y vistas para el diccionario de datos de la base de datos están almacenados en el esquema SYS. Estas tablas y vistas son críticas para el funcionamiento de la base de datos ORACLE. Para mantener la integridad del diccionario de datos, las tablas del esquema SYS son manipulados solo por la base de datos. Nunca se debería modificar algo o crear tablas en el esquema del usuario SYS.

SYSTEM:
El usuario SYSTEM se utiliza para crear tablas y vistas adicionales que muestran información administrativa, tablas internas y vistas utilizado por varias opciones y herramientas de la base de datos ORACLE. No se recomienda utilizar el esquema SYSTEM para almacenar tablas de interés para usu…

Parámetro de entrada y salida – PL/SQL

Parámetro de entrada y salida – PL/SQL:
Los parámetros de entrada y salida no son los parámetros de inicialización de la base de datos ORACLE. Los parámetros de entra y salida son utilizados mayormente en implementaciones de funciones, procedimientos almacenados o bloques de código bajo el lenguaje del PL/SQL, se considera que ambos parámetros (entra y salida) puedan realizar operaciones en el mismo bloque PL/SQL, es decir, si enviamos un parámetro de entrada hará que cumpla cierta operación y retornara los valores de salida de dicha operación procesada de acuerdo al parámetro de ingresado. Es de acuerdo al caso que nos presenta en la implementación.
Algo importante al definir los parámetros, es saber y considerar cuántos tipos de parámetro existe si solo hablamos de entrada y salida, en realidad mi determinación seria 3 tipos:

Parámetros:

IN – entrada
OUT – salida
IN OUT – entrada salida

Parámetro IN – entrada:
El comportamiento común de estés tipos de parámetros es estar siempre pendiente d…