Después de un post en el que hablé acerca de lo que son las Azure Functions ya podemos comenzar a ahondar un poco más en algunos detalles. En esta mini serie de cuatro artículos veremos como hacer cada una de las operaciones CRUD de SQL usando una función, naturalmente una función para cada operación, recuerda que cada Función debe tener únicamente una sola tarea.
Requisitos para este tutorial:
Una base de datos con los campos que tú quieras, para efectos prácticos y solo usaré una tabla con pocas columnas.
Una suscripción de Azure en donde puedas crear tu Azure Function.
Creación de archivos adicionales en Functions.
En la barra lateral de la derecha podrás ubicar muy bien los archivos que componen a una función. Ahí agrega un archivo con el mismo nombre de la tabla y será una clase, en Functions, las clases son archivos .csx. Naturalmente, después de agregar la clase modelo, agrega las propiedades adecuadas, iguales a las columnas de tu tabla.
Con el modelo creado, ahora crea un archivo de tipo JSON y llámalo project. Este archivo te permite agregar las referencias vía NuGet que quieras, para este caso usaremos solo dos.
{ "frameworks": { "net46":{ "dependencies": { "System.Data.SqlClient":"4.1.0", "Microsoft.WindowsAzure.ConfigurationManager":"3.2.1" } } } } |
Ve a tu clase run.csx y escribe lo siguiente.
#r "System.Data" #r "System.Data.Linq" #load "Contactos.csx" using System.Net; using System.Data.SqlClient; using System.Data.Linq; public static async Task Run(HttpRequestMessage req, TraceWriter log) { var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["contactosstring"].ConnectionString; SqlConnection conn = new SqlConnection(connectionString); DataContext db = new DataContext(conn); Table contactosTable = db.GetTable(); IEnumerable items = contactosTable.ToList(); return req.CreateResponse(HttpStatusCode.OK, items); } |
Observa lo siguiente:
La directiva #r sirve para invocar referencias del framework.
La directiva #load sirve para agregar otras clases, naturalmente aquí buscamos agregar la clase recién creada.
Las sentencias using son usadas como habitualmente se usan.
El resultado que obtendrás es de tipo HttpResponseMessage.
El código como verás es esencialmente el mismo, no hay mucha diferencia a como lo harías de manera básica en un proyecto tipo WebAPI. El resultado regresará una respuesta HTTP satisfactoria y además la colección de datos.
Por último, solo ve a la configuración de tu aplicación, es el siguiente menú.
Hay un apartado especial para la opción de cadenas de conexión. El nombre que le pongas es el mismo que debes poner en tu archivo run.csx para establecer la conexión. Escribe en el segundo campo naturalmente tu cadena de conexión de SQL.
Tienes ya tu función lista, solo basta que la pruebes ahora con tu pestaña de Test, solo recuerda que debido a que estás consultando, el método que debes usar es GET. Lo que verás es lo siguiente.
¡Así de fácil ya tienes una función lista para consultar de manera general a SQL!
Considera que ahora lo que tieness un JSON con todas las propiedades pero sin entidades. Si quieres hacerle la vida más fácil a tu desarrollador de aplicaciones podrías entonces optar por regresar un valor de tipo IEnumerable en tu método Run. Como a continuación se ve:
#r "System.Data" #r "System.Data.Linq" #load "Contactos.csx" using System.Net; using System.Data.SqlClient; using System.Data.Linq; public static async Task<IEnumerable> Run(HttpRequestMessage req, TraceWriter log) { var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["contactosstring"].ConnectionString; SqlConnection conn = new SqlConnection(connectionString); DataContext db = new DataContext(conn); Table contactosTable = db.GetTable(); IEnumerable items = contactosTable.ToList(); return items; } |
Lo chistoso es que en la pestaña de pruebas no verás grandes diferencias pero al desarrollar una aplicación es que podrás notarlo.
En este repositorio de GitHub he dejado un proyecto en donde viene un cliente para cada uno de los dos escenarios, se trata de una simple aplicación de consola que te dará un mejor panorama de que opción elegir y como implementarla.
¡Nos vemos!
Excelente Amin. Y nunca olvidar utilizar ‘using’ para liberar apropiadamente los recursos. Ahora que me de un tiempo empezaré a explorar Azure Functions.
Éxito.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
Muy buen tip!!!!!