Blog

Trazando peticiones y añadiendo logs en nuestra API asp.net
En un post anterior explique cómo añadir trazas en nuestros registros de base de datos con Entity Framework . Estás trazas nos pueden ayudar en ciertas ocasiones, pero son insuficientes en un proyecto real en el que tengamos que tener unas trazas y logs más sofisticados. En mis proyectos, suelo añadir, además de las citadas anteriormente, trazas de las peticiones y logs escritos en ciertos casos en los que me interesa incluir información interesante. Este proceso de trazado es crucial para la depuración, el monitoreo del rendimiento y la seguridad. - Depuración : Cuando ocurre un error, las trazas nos ayudan a identificar rápidamente la causa. - Monitoreo de Rendimiento : El trazado nos permite observar el comportamiento de nuestra API en tiempo real y optimizarla. - Seguridad : Mantener un registro de todas las actividades ayuda en la detección de actividades sospechosas. Esta implementación podría haberla hecho con una...

Añadiendo trazas a nuestros registros de base de datos con EF
Lo que pretendo con este post es mostrar como podemos dejar una pequeña traza de las operaciones realizadas sobre nuestros registros de base de datos con Entity Framework . Digo pequeña, porque no puede considerarse que, con esta implementación, tengamos un sistema auditable. No obstante, puede ser un buen complemento a ese. Lo que vamos a conseguir es almacenar en la base de datos, asociado a cada registro, la fecha de creación, modificación y borrado, además del usuario que realiza esta operación. Creando una entidad base Si en nuestro proyecto no tenemos una entidad base de la que heredan todas las clases que definen las entidades de nuestra base de datos, en un buen momento para crearla. Para este ejemplo, vamos a añadir propiedades para trazar toda la información comentada anteriormente, por lo que nuestra entidad base quedaría de la siguiente manera. public abstract class BaseEntity { public DateTime DateOfCreation...

Eliminar QueryFilter en EF para una consulta en concreto
Hoy os traigo un tip sencillo, pero que nos puede servir de ayuda en ciertas situaciones. Hace un tiempo escribí un post sobre cómo implementar el borrado lógico en Entity Framework dónde utilizaba un query filter para evitar que los registros borrados, de manera lógica, en una tabla no apareciesen en las consultas recibidas sobre ésta. protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); ... var entityBuilder = modelBuilder.Entity<DbEntity (); entityBuilder.HasQueryFilter(x = !x.IsDeleted); ... } Pero, ¿qué pasa si hay alguna operación en la que sí necesito recuperar esos datos marcados como borrados? No hay problema, para conseguirlo basta con indicarle al DbSet de Entity Framework que ignore los query filters existentes. Por ejemplo, si queremos contar todos los registros asociados a un usuario, independientemente de si están borrados o no, lo podríamos hacer de la siguiente manera. return await DbEntity .IgnoreQueryFilters() .Where(x = x.UserId == userId) .CountAsync(cancellationToken);

Autenticación JWT con Identity
Lo que pretendo con este post, es implementar la autenticación con JWT en una API creada con ASP.NET. Para ello, voy a exponer endpoints para el registro de un usuario, su identificación y el refresco de un token . Hay muchas maneras de realizar esta implementación pero, para este ejemplo, me voy a apoyar en Identity . A continuación iré detallando todos los pasos para una completa implementación usando Identity , como he comentado antes, y EF con una base de datos SQL Server . Configurando nuestra base de datos Lo primero que tenemos que hacer es dar a nuestra aplicación la capacidad de guardar usuarios, para realizar el registro e identificación de estos. Para ello, antes de nada tenemos que añadir el nuget Microsoft.AspNetCore.Identity.EntityFrameworkCore . Una vez añadido tendremos acceso a las clases que identity nos proporciona, pudiendo sobre escribirlas para añadir funcionalidad extra. Para el ejemplo, voy a...

Creando un chat en asp.net con gRPC
Google Remote Procedure Call (gRPC) se introdujo para ASP.NET Core 3.1 en noviembre de 2019. Tal y como su nombre indica, es un framework de Remote Procedure Call creado por Google, de código abierto. Este framework aprovecha el protocolo HTTP/2 para transportar mensajes en formato binario. Estos mensajes se serializan y deserializan utilizando Protocol Buffers , que se utilizan para definir el contrato de los servicios para el intercambio de esos mensajes. Puede ser un buen punto de partida ver algunas diferencias entre llamadas RPC y API REST , con el que estamos más acostumbrados a trabajar. - En una API REST , una entidad se considera un recurso y utiliza verbos HTTP y URL específicas para exponer operaciones sobre este recurso. La convención RESTful nos anima a usar verbos específicos en una situación concreta: GET, POST, PUT, PATCH y DELETE . De manera análoga, REST depende de los códigos...

Ejecutar acciones en segundo plano en asp.net
En el post anterior vimos como lanzar acciones al iniciar y finalizar nuestra aplicación asp.net . Pero hay ocasiones en las que tenemos que lanzar acciones en background que se ejecuten cada cierto tiempo, o que se desencadenen tras cierto evento. En ambos casos podemos utilizar un BackgroundService , que no deja de ser una implementación de IHostedService . Para utilizarlo, es necesario implementar el método ExecuteAsync , que se lanza en el StartAsync y se cancela es StopAsync . El método ExecuteAsync se lanza como fire and forget , por lo que no es necesario que su ejecución termine para que el servidor esté disponible. Por tanto, las acciones que aquí se añadan no deben ser obligatorias para el correcto inicio de nuestra aplicación. Realizando acciones en background cada cierto tiempo El caso más sencillo y, seguramente el más utilizado, con BackgroundService, es el de ejecutar acciones cada cierto...

Lanzar acciones al iniciar y terminar nuestras aplicaciones ASP.NET
Si queremos lanzar al iniciar y/o finalizar una aplicación asp.net, la solución la tenemos en los IHostedServices . En términos sencillos, IHostedService permite definir acciones que deben ejecutarse en segundo plano y proporciona métodos para iniciar y detener esas operaciones de manera controlada. Esos métodos son los siguiente: - Task StartAsync (CancellationToken cancellationToken) - Task StopAsync (CancellationToken cancellationToken) La manera de implementarla es bastante sencilla. A continuación se muestra un ejemplo en el que tenemos dos hosted service . public class HostedServiceOne : IHostedService { public async Task StartAsync(CancellationToken cancellationToken) { Console.WriteLine($" = {DateTime.Now} Hosted service one starting..."); await Task.Delay(1 000, cancellationToken); Console.WriteLine($" = {DateTime.Now} Hosted service one started"); } public async Task StopAsync(CancellationToken cancellationToken) { Console.WriteLine($" = {DateTime.Now} Hosted service one stopping..."); await Task.Delay(1 000, cancellationToken); Console.WriteLine($" = {DateTime.Now} Hosted service one stopped"); } } public class HostedServiceTwo : IHostedService { public async Task StartAsync(CancellationToken cancellationToken) { Console.WriteLine($" =...

Primeros pasos con Azure Communication Service en Flutter para hacer videollamadas
En este post vamos a ver cómo comenzar a integrar Azure Communication Service en nuestras aplicaciones. Crearemos el servicio en Azure y lo utilizaremos desde una aplicación Android/iOS creada con flutter . ¿Qué vamos a crear? Para poneos en contexto, aquí vemos el resultado final de la app que vamos a crear. Nótese que las opciones que nos ofrece Communication Service son tan amplias que es imposible abordarlas todas en un artículo, por lo que, como he indicado en el título, aquí vamos a dar nuestros primeros pasos. Nos permite el envío de email, SMS, llamadas de voz, chat y videollamadas. Concretamente, vamos a tratar la llamada grupal, aunque utilizando este servicio también se podría implementar llamadas punto a punto. Creando el servicio en Azure Crear este servicio es bastante sencillo. Lo primero que tenemos que hacer es ir a nuestro portal de Azure y crear un nuevo recurso ....

Personalizando los settings en los test de nuestra API
Uno de los primeros proyectos que creo al empezar una solución, es un proyecto de test, ya que me ayuda a probar las funcionalidades que implemento, a asegurarme de no romper nada (al menos no romper lo funcionalidades importantes) e incluso a depurar ciertas features sin tener que levantar todo mi sitio web. Al igual que para el API, me gusta tener los settings de mis test en un archivo json separado. De esta forma, si otra persona lanza los tests en su maquina, bastará con asegurar que los valores de esos settings son correctos. Del mismo modo, puedo cambiar valores para que sean propios de los tests, por ejemplo, las cadenas de conexión de las bases de datos, ya que en los test las creo al vuelo y las elimino al terminar dichos tests. Por último, también considero interesante el poder cambiar los valores de este json de settings...

Versionando nuestras APIs en dotNet
En este post quiero hablar sobre la importancia de versionar nuestras APIs y cómo hacerlo en nuestras aplicaciones dotNet (hay muchas maneras de hacerlo, aquí solo os voy a contar la que yo utilizo) ¿Por qué versionar nuestras APIs? Es importante mantener versiones de nuestras APIs, principalmente, para evitar problemas que rompan aplicaciones clientes que la consumen. Estos problemas suelen estar relacionados con cambios en algún DTO (modificando o eliminando alguna propiedad) y con cambios en algún endpoints , modificando su nombre, parámetros que devuelve o retorno. Teniendo nuestras APIs versionadas, podemos incluir ese tipo de cambios añadiendo una nueva versión y, así, evitar problemas con clientes que utilicen la versión actual. Implementando versionado en dotNet Para realizar esta implementación, me he apoyado en el paquete nuget Asp.Versioning.Mvc.ApiExplorer por lo que el primer paso es añadirlo a nuestro proyecto. Configurando nuestra aplicación Una vez instalado, añadimos el versionado a nuestro...

Controlando accesos concurrentes con semáforos en dotNet
Los semáforos son una herramienta de sincronización utilizada para limitar el número de subprocesos que pueden tener acceso a un recurso o grupo de recursos simultáneamente. A diferencia de los locks , este límite no tiene porque restringirse a un solo proceso, sino que se puede configurar para permitir un numero personalizado de accesos simultáneos. Para aclarar el concepto, voy a mostrar un ejemplo utilizando los semáforos. Usando semáforos El ejemplo que muestro a continuación es muy sencillo. Simplemente tengo un método que imprime la hora y, tras ello, espera 5 segundos. Este método está protegido con un semáforo, por lo que solo podrán ejecutarlo de manera simultanea un numero de hilos. Para el ejemplo, 3. example.DoSomethingAsync(); example.DoSomethingAsync(); example.DoSomethingAsync(); example.DoSomethingAsync(); example.DoSomethingAsync(); example.DoSomethingAsync(); example.DoSomethingAsync(); public class Example : IDisposable { private Semaphore semaphoreObject; public Example() { semaphoreObject = new Semaphore(initialCount: 3, maximumCount: 3); } public async void DoSomethingAsync() { semaphoreObject.WaitOne(); Console.WriteLine(DateTime.Now);...

Utilizando lock en dotNet
Los locks son mecanismos utilizados en programación concurrente para controlar el acceso a recursos compartidos y evitar problemas de sincronización. Se utilizan para garantizar que solo un thread tenga acceso a un recurso compartido en un momento dado. A continuación, voy a mostrar cómo utilizarlo. Usando lock Lock se utiliza para crear una sección crítica de código que garantiza que solo un subproceso pueda acceder a ella en un momento dado. Esto ayuda a evitar problemas de sincronización entre subprocesos al acceder a recursos compartidos. Para entenderlo un poco mejor, vamos a ver un ejemplo. En el siguiente código se incrementa un valor entero cada vez que se ejecuta DoOperation . Observándolo, no podríamos asegurar cual va a ser la salida cuando lo ejecutemos, ya que al lanzar las tareas de forma simultanea, no sabemos el orden en el que accederán al value para modificar su valor. Console.WriteLine("Test 1"); var...

Utilizando AuthenticationHandler para controlar el API key de nuestras APIs
La semana pasada escribí un artículo sobre cómo añadir un API key a nuestras API utilizando un middleware. Tal y como comenté, hay varias maneras de hacer esta implementación, así que hoy os traigo otra, basándonos en lo que nos ofrece el framework para simplificarnos esta implementación. Implementando AuthenticationSchemeOptions El primer paso será la implementación de AuthenticationSchemeOptions . Podríamos no necesitar la implementación que he hecho, pero he añadido el campo HeaderName para tener la posibilidad de cambiar el nombre de la key que se buscará en la cabecera en la que debe estar el API key . Por defecto, el nombre de esa cabecera es Authorization (obtenido de HeaderNames.Authorizarion ) pero, como veremos más adelante, lo vamos a cambiar. public class ApiKeySchemeOptions : AuthenticationSchemeOptions { public const string Scheme = "ApiKeyScheme"; public string HeaderName { get; set; } = HeaderNames.Authorization; } Implementando AuthenticationHandler Esta implementación es la que tendrá...

Utilizando un API key en nuestras APIs
En este post os voy a hablar sobre lo que es un API Key, qué aplicaciones tiene y como implementarla en nuestra aplicación dotNet . ¿Qué es un API Key? Vamos a comenzar explicando qué es una API Key . API Key , son las siglas de API : Application Programming Interfaces , que se traduciría como interfaz de programación de aplicaciones, y Key : significa Llave, por lo tanto podríamos decir que es un identificador que sirve para la autenticación de un usuario para el uso de un servicio, es decir una clave para autenticarte cada vez que se utiliza. Es importante mantener la API Key segura y no compartirla públicamente, ya que cualquier persona que tenga acceso a ella puede hacer uso de la API en nombre del titular de la clave. Si una API Key se compromete, es necesario revocarla y generar una nueva para garantizar la...

La importancia de usar CancellationToken en nuestras APIs
Hoy vengo a contaros por qué es importante utilizar tokens de cancelación en los endpoints de nuestras APIs . Primero de todo. ¿Qué es un token de cancelación ( CancellationToken de aquí en adelante)? Un CancellationToken es un mecanismo de cancelación proporcionado por dotNet que se utiliza para solicitar la cancelación de una operación en progreso. Por ejemplo, supongamos que tenemos un endpoint que realiza una tarea larga o costosa, como realizar una consulta a una base de datos o llamar a un servicio externo. Si un cliente realiza una solicitud y luego cambia de opinión o cierra la conexión, puede ser deseable cancelar la tarea en curso para liberar recursos y evitar un trabajo innecesario. Una vez que sabemos qué es un CancellationToken toca contestar la siguiente pregunta. ¿Por qué debo usarlo? Existen varias razones para usarlo. Aquí enumero algunas de ellas: - Mejora la experiencia del cliente: Especialmente...

Cuenta atrás circular en flutter
En esta ocasión he creado un control en flutter para mostrar una cuenta atrás, con un circulo de progreso que, en el centro, tiene un texto que expresa el tiempo restante en horas, minutos y segundos, tal y como se muestra a continuación. Diseñando el control Para crearlo, he utilizado un StatefulWidget . Para definir su aspecto, he utilizado dos CircularProgressIndicator superpuestos con un Stack . El que queda detrás es el circulo gris que hace las veces de fondo. Y el que queda delante es el circulo azul que marca el progreso de la cuenta atrás. Además, en el interior de esos CircularProgressIndicator he añadido un Text que muestra el tiempo restante en formato hh:mm:ss. @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ Stack( children: [ const SizedBox( height: widget.diameter, width: widget.diameter, child: CircularProgressIndicator( value: 1, color:...

Números animados en dotNet MAUI
En esta ocasión os traigo un truco sencillo sobre cómo crear una animación vistosa a la hora de mostrar datos numéricos, como pueden ser valores estadísticos, importes… Para ello, he creado un ejemplo con un control, que recibe un valor, un string format y el tiempo, en milisegundos, que debe durar la animación. Si inspeccionamos el control, vemos que tiene una bindable property por cada uno de los valores expuestos. public static readonly BindableProperty ValueProperty = BindableProperty.Create(nameof(Value), typeof(decimal), typeof(AnimatedValue), defaultValue: 0m, defaultBindingMode: BindingMode.OneWay, propertyChanged: ValueChanged); public static readonly BindableProperty FormatProperty = BindableProperty.Create(nameof(Format), typeof(string), typeof(AnimatedValue), defaultBindingMode: BindingMode.OneWay, propertyChanged: FormatChanged); public static readonly BindableProperty DurationProperty = BindableProperty.Create(nameof(Duration), typeof(uint), typeof(AnimatedValue), defaultValue: (uint)1 000, defaultBindingMode: BindingMode.OneWay); ... public decimal Value { get = (decimal)GetValue(ValueProperty); set = SetValue(ValueProperty, value); } public string Format { get = (string)GetValue(FormatProperty); set = SetValue(FormatProperty, value); } public uint Duration { get = (uint)GetValue(DurationProperty); set = SetValue(DurationProperty, value); } La...

Trabajando con mapas en dotNet MAUI
Una de las novedades que se ha lanzado ultimamente en dotNet MAUI es la posibilidad de utilizar mapas. Por lo que estos días he estado jugando un poco con todas las posibilidades que nos ofrecen éstos. Preconfiguración para utilizar mapas Para poder utilizar mapas en nuestra aplicación, es necesario hacer algunas acciones previas que detallo a continuación: - Instalar el nuget Microsoft.Maui.Controls.Maps - Ejecutar, desde el método CreateMauiApp de la clase MauiProgram , builder.UseMauiMaps public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder ... .UseMauiMaps() ... return builder.Build(); } - En iOS, modificar el archivo info.plist para informar al usuario de que se va a utilizar su localización NSLocationAlwaysAndWhenInUseUsageDescription Can we use your location at all times? NSLocationWhenInUseUsageDescription Can we use your location when your app is being used? - En Android, es necesario modificar el archivo AndroidManifest.xml para incluir nuestro API key de Google Maps (en esta web...

Settings por entorno en dotNet MAUI
Una de las primeras cosas que siempre hago en mis aplicaciones móviles, creadas con dotNet MAUI, es definir los entornos que voy a utilizar (para este ejemplo, desarrollo, preproducción, y producción) y gestionar las configuraciones propias de cada entornos con archivos json , de una manera análoga a como se hace en asp.net . Los pasos que sigo para conseguirlo, son los siguientes. 1\. Crear configuraciones de solución Desde el editor de configuración, añado una configuración por cada entorno, para Debug y Release , por lo que en el ejemplo, tendré 6 configuraciones: DebugDevelopment, ReleaseDevelopment, DebugPreproduction, ReleasePreproduction, Debug y Release , siendo Debug y Release los que utilizo como configuraciones de producción. 2\. Crear configuraciones en los proyectos En el ejemplo que estoy creando, solamente tengo un proyecto, pero si tuviese más, habría que repetir estos pasos para cada uno de los proyectos, siempre y cuando tengan funcionalidades que dependan...

Actualización masiva de datos en EF 7
Uno de los problemas históricos que teníamos en Entity Framework era la edición masiva de datos, o el borrado masivo de éstos. Era necesario recurrir a soluciones externas, como la utilización de operaciones Bulk a través de métodos de extensión en librerias externas o la creación de un procedimiento almacenado, ya que el rendimiento que ofrecía el propio Entitty Framework dejaba mucho que desear. Como os habréis dado cuenta, en la frase anterior he escrito en pasado. Sí, en pasado, porque este problema se ha solucionado. Ahora Entity Framework , a partir de la versión 7, nos ofrece una solución para hacer esta edición/borrado masivo sin tener que hacer un gran sacrificio de rendimiento. Esta solución pasa por la utilización de los métodos ExecuteUpdateAsync y ExecuteDeleteAsync que se encuentra en la clase DbContext . El método ExecuteUpdateAsync utiliza una expresión lambda para especificar las entidades que se van a actualizar...

Creando CRUD para nuestra API de forma rápida
Estos últimos días he estado trabajando con Visual Studio 2022 en Windows en un pet project y he descubierto una funcionalidad que me está ahorrando algo de tiempo a la hora de crear CRUD para mi API. Porque, admitámoslo, aunque nuestro proyecto sea muy complejo, siempre es necesario crear algún CRUD básico que nos quita algo de tiempo a pesar de ser una tarea sencilla. Es en este punto donde entra la funcionalidad que he descubierto, new scaffolded item... Para comenzar a usar esta funcionalidad, el primer paso es crear nuestro modelo, a partir del cual crearemos la funcionalidad CRUD. Para este ejemplo, he creado un modelo sencillo para almacenar tareas. public class TaskItem { public int Id { get; set; } public DateTimeOffset CreationDate { get; set; } public string Title { get; set; } public string Description { get; set; } } Una vez creado el modelo, estamos...

DebuggerDisplay en C#
Hoy os traigo un post cortito, pero no por ello menos interesante. Cuando desarrollamos una aplicación, empleamos gran parte del tiempo depurando para ver qué pasa en las tripas de nuestro código. En muchas ocasiones, tenemos que estar inspeccionando objetos, navegando entre sus distintas propiedades, hasta llegar a evaluar la que buscamos. Es en estos casos donde es interesante que utilicemos el atributo DebuggerDisplay . Éste permite definir una representación personalizada de un objeto cuando se muestra en el depurador. Lo que nos facilita ver los valores relevantes de un objeto en lugar de tener que inspeccionar cada uno de sus miembros individuales. La mejor manera de entenderlo es que veamos un ejemplo. Para ello he creado una aplicación muy sencilla, con una clase Person . public class Person { public string Name { get; set; } public string Surname { get; set; } public int Age { get; set;...

Control de concurrencia en Entity Framework
El control de concurrencia en una base de datos es esencial para garantizar la integridad de los datos y evitar problemas de actualización simultánea. Para implementarlo hay varias opciones disponibles. Una de las formas más comunes, y la que vamos a implementar en este post, es utilizar el mecanismo optimista. Este mecanismo asume que las colisiones de actualización son infrecuentes y, por lo tanto, permite que varios usuarios modifiquen los mismos datos al mismo tiempo. Sin embargo, si dos usuarios intentan actualizar el mismo registro a la vez, uno de ellos recibirá un error y tendrá que volver a intentar la actualización. La implementación de este mecanismo en Entity Framework es bastante sencilla. El primer paso sería añadir una propiedad RowVersion a nuestra entidad e indicar que hará las funciones de time span . De está manera, siempre que se guarde un registro en la base de datos, se actualizará...

Borrado lógico con Entity Framework
Hay muchas ocasiones en las que queremos dar al usuario la opción de borrar información de la base de datos, pero no nos interesa eliminar el registro de la tabla, por mantener un histórico, por evitar problemas con foreign keys ... En estos casos, la mejor solución es la implementación de un borrado lógico. De esta forma, a ojos del usuario los datos han quedado eliminado, pero realmente siguen existiendo en la base de datos. El borrado lógico en Entity Framework es una técnica utilizada para conseguir lo anteriormente expuesto, que no es otra cosa que marcar un registro como eliminado en lugar de borrarlo físicamente de la base de datos. Esto permite recuperar los datos en caso de que sean necesarios en un momento posterior. Para implementar dicho borrado lógico, podemos seguir los siguientes pasos: - En el modelo de entidad, agregar una propiedad de tipo bool que indique...

Memory game con Flutter
Últimamente, he estado echando un ojo a Flutter . Hay mucha gente que me ha hablado de sus bondades tanto para el desarrollador (haciéndolo más productivo) como para el usuario final (ofreciendo un buen rendimiento). En lugar de aventurarme a hacer una app de un temática nueva, he preferido volver ha hacer un juego de memoria, exactamente igual que el que hice con dotNet MAUI , de esta manera, podría compararlos y sacar mejores conclusiones. A continuación os dejo algunos GIF en los que podéis ver el diseño y comportamiento de la app. Y también os informo de los detalles más destacados de la aplicación. Aplicación en acción Paquetes utilizados - intl: Lo utilizo para implementar la internacionalización de la aplicación. Es decir, añadir los textos en los distintos idiomas. - cupertino\ icons: Paquete con los iconos utilizada en la app. Muy cómodo para no tener que añadir las imágenes...

Memory game con dotNet MAUI
Pasan las semanas y sigo jugando con dotNet MAUI . Tras el conecta 4, le he cogido el gusto a implementar juegos sencillos, porque ahora he creado un memory game . A continuación os dejo algunos GIF en los que podéis ver el diseño y comportamiento de la app. Y también os informo de los detalles más destacados de la aplicación y posibles mejoras futuras. Aplicación en acción Nugets - ReactiveUI.Maui: Al igual que en otras aplicaciones que he desarrollador, he utilizado este nuget para crear las clases bases de las que cuelgan tanto mis elementos gráficos como sus ViewModel . Me siento muy cómodo trabajando con él. Creo que simplifica mucho el desarrollo sin penalizar el rendimiento y dándome el control para liberar la memoria utilizada por ciertos recursos, como bindings , suscripción a eventos, observables... - ReactiveUI.Fody: Lo uso para ahorrar algo de código al trabajar con RxUI...

Microsoft MVP
Esta mañana he recibido uno de los paquetes que más ilusión me ha hecho en mucho tiempo. Sí, exacto. Como has podido averiguar por el título, he recibido el premio MVP de Microsoft , concretamente en la categoría de Developer Technologies . Además de la ilusión con la que he desempaquetado el premio, mi sentimiento ha sido, y es, de agradecimiento. Agradecimiento a toda la gente que me ha hecho crecer en esta profesión. Desde profesores y compañeros de la universidad, muchos de los cuales son grandes amigos, a compañeros de trabajo con los que me he cruzado a lo largo de mi carrera y de los que he aprendido todo lo que sé. En el apartado laboral, quiero hacer una mención especial a DevsDNA. A todas las personas con las que he trabajado durante los últimos 3 años y medio y de las que no he hecho otra cosa...

Conecta 4 con dotNet MAUI
En esta ocasión, en lugar de traer algún mini tutorial explicando cómo hacer una funcionalidad especifica, os traigo una app completa desarrollada con dotNet MAUI . Esta es el famoso juego Conecta 4 . Es una single page app, por lo que no hay demasiado que contar. A continuación os dejo algunos GIF en los que podéis ver el diseño y comportamiento de la app. Y también os detallo los nugets que he usado y los motivos que me han llevado a utilizarlos. Diseño y comportamiento Nugets - SkiaSharp.Views.Maui.Controls : Lo he utilizado para dibujar el tablero, ya que no se me ocurría ninguna otra manera de pintar la parte exterior de una circunferencia, manteniendo su interior transparente, para que las fichas se vean caer por dentro del tablero. - ReactiveUI.Maui: Obviamente, la aplicación podría haberse desarrollado sin este nuget , pero siempre lo incluyo en mis proyecto porque me...

Animando la cabecera de un CollectionView en Xamarin.Forms
Sigo con mi saga de post sobre animaciones en Xamarin Forms . En esta ocasión quiero mostrar cómo conseguir animar la cabecera de un CollectionView , cambiando el tamaño de ésta y moviendo los elementos que contiene. De esta manera, podemos tener información detallada, o con un mayor tamaño al iniciar nuestra página y ver los primeros elementos de la colección, pero reducir su tamaño y su información a medida que se hace scroll y aparecen más elementos en pantalla, tal y como se muestra a continuación. Tal y como he comentado en otras ocasiones, aquí os muestro solamente una manera de hacer este tipo de animaciones. No es la única y no tiene porque ser la mejor. Lo primero que podemos pensar es utilizar el header del CollectionView para conseguir el efecto mostrado anteriormente. ERROR. Si utilizamos el header , éste se mantendrá en la parte superior de la...

Animando transiciones entra páginas en Xamarin.Forms
Una de las cosas que hace que nuestras aplicaciones sean más vistosas y tengan un aspecto más pro, son las animaciones. Hace un tiempo escribí éste post explicando cómo hacer animaciones sencillas en Xamarin.Forms. Lo que quiero explicar aquí va un poco más allá. Os voy a contar cómo consigo animar transiciones entre páginas, moviendo sus elementos para que aparezcan y desaparezcan de pantalla a nuestro antojo. Nótese que esta es la forma en que yo hago este tipo de animaciones, pero no tiene porque ser la única ni la mejor. Como siempre, para llevar a cabo la explicación, he creado un ejemplo con dos páginas en las que realizo animaciones tanto al navegar hacía delante como hacía atrás. Para empezar, lo primero que vamos a hacer es que nuestras páginas hereden de un ContentPage base, que implementará dos métodos para hacer animaciones cuando se navega desde/hacia una página. Estos...

Moviendo un carousel en Xamarin Forms
Hace unos días, tuve la necesidad de crear un carousel view , por lo que no dude y descargué el Nuget CardsView de @Andrik\ Just4Fun La complicación que tenía es que mi control no solo tenía que comportarse como un carousel , permitiendo visualizar distintos items haciendo scroll vertical, sino que también tenía que permitir mover todo el control de izquierda a derecha y viceversa (tal y como se muestra a continuación), ya que estos movimientos lanzarían cierta funcionalidad (esta funcionalidad no es el objetivo del post). La primera opción que me planteé fue la de incluir un PanGestureRecognizer para detectar el movimiento horizontal y mover la tarjeta. Lo cual funcionó bien en iOS. <Grid x:Name="mainGrid" <Grid RowDefinitions=" ,500, " ColumnDefinitions=" ,250, " <Frame x:Name="frCarousel" Grid.Row="1" Grid.Column="1" CornerRadius="20" HasShadow="False" IsClippedToBounds="True" Padding="0" BorderColor="Black" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" <controls:CarouselView x:Name="cvImages" IsCyclical="False" IsHorizontalOrientation="False" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" <controls:CarouselView.ItemTemplate <DataTemplate <Image Source="{Binding .}" Aspect="AspectFill" BackgroundColor="Transparent" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"/ </DataTemplate...

Radio button personalizado en Xamarin Forms 5
Uno de los controles que ha sufrido bastantes cambios con la llegada de Xamarin.Forms 5 es el RadioButton . Se han incluido nuevas propiedades, que facilitan su personalización. Por ejemplo, BorderColor, CornerRadius, Content, etc... Gracias a la propiedad content, podemos meter una view en el RadioButton , llegando a tener lo que queramos, consiguiendo efectos como el siguiente. <RadioButton Grid.Column="0" GroupName="Group1" CornerRadius="20" BackgroundColor="LightGray" BorderColor="Black" <RadioButton.Content <StackLayout Orientation="Vertical" Spacing="0" VerticalOptions="Center" <Image Source="email.png" / <Label Text="Email" HorizontalTextAlignment="Center" / </StackLayout </RadioButton.Content </RadioButton No obstante, a mi juicio, el cambio más importante es que ahora hereda de TemplatedView , por lo que podemos realizar el diseño que más nos interese, sin limitarnos a las propiedades que ofrece para cambiar su aspecto. Asimismo, como tiene dos visual states ( Checked y Unchecked ) podemos usarlos para dar una aspecto diferente al control, en función de si está chequeado o no. De esta manera, el objetivo...

Control templates en Xamarin Forms
Gracias a las control templates , en Xamarin Forms, podemos cambiar el aspecto de ContentViews y ContentPages en tiempo de ejecución. De esta manera, podemos tener distintas visualizaciones de un mismo control o una misma página, sin que eso suponga tirar muchas líneas de código o crear complejos algoritmos con los que decidir qué aspecto dar a un elemento. Hay que tener cuidado, ya que las plantillas hay que utilizarlas cuando queramos visualizaciones distintas que impliquen el uso de controles diferentes o cambios en la disposición de éstos en la pantalla. Ya que podemos caer en la tentación de usar ControlTemplates en situaciones en las que podemos usar estilos. ControlTemplate en un ContentView Para ver el funcionamiento de este caso, vamos a ver un ejemplo. Partimos del siguiente control InfoView , para el que no se ha definido interfaz, ya que la definiremos usando ControlTemplates public class InfoView : ContentView...

Alert dialog personalizado con Xamarin Forms
Es este post, vamos a ver cómo crear un dialogo de alerta personalizado. Para el ejemplo, se crearán dos casos, uno para mostrar un mensaje informativo y otro para mostrar un mensaje que requiera confirmación. Para mostrar los 2 tipos de diálogos, se ha creado un servicio con la siguiente interfaz. public interface IAlertDialogService { Task ShowDialogAsync(string title, string message, string close); Task<bool ShowDialogConfirmationAsync(string title, string message, string cancel, string ok); } Antes de ir con la implementación de la interfaz, vamos a ver cómo crear el dialogo de alerta, que será llamado desde dicha implementación. Este dialogo, no es más que un popup creado con la ayuda del nuget Rg.Plugins.Popup , que recibe la información que tiene que mostrar (título, mensaje, acciones, etc...). Este nuget requiere de una mínima configuración, basta con inicializarlo desde el AppDelegate y el MainActivitys , para iOS y Android, respectivamente Además, para informar de...

Reproducción de vídeo en Chromecast con Xamarin Forms
Hoy os traigo otro Nuget interesante y muy fácil de utilizar, para reproducir vídeo en dispositivos Chromecast. Su nombre es GoogleCast. Aquí os dejo un enlace al repositorio, en el que encontraréis algo de documentación, aunque su uso, como vamos a ver a continuación, es muy sencillo. Para explicar cómo usar este Nuget , he construido una app muy sencilla, en la que aparece un entry, en el que escribir la URL del vídeo que queremos reproducir, y un botón que, al pulsarse, buscará todos los dispositivos Chromecast en los que se puede reproducir un vídeo. Al seleccionar una de esos dispositivos, el vídeo se reproducirá en él. Los puntos importantes son: - ¿Cómo cargar la lista de dispositivos Chromecast? - ¿Cómo reproducir el vídeo en un dispositivo? En nuestro ejemplo, los dispositivos se cargan desde el método LoadReceivers . En éste, se utiliza el Nuget para obtener una lista...

Transiciones entre páginas con Xamarin.Forms
Con este post quiero enseñaos un Nuget que últimamente utilizo mucho, ya que da toque mucho más profesional a las transiciones entre páginas con Xamarin Forms. Este es SharedTransitions Principalmente me gusta porque se consigue hacer una transición mucho más suave, en la que, en lugar de pasar de una página a otra, se produce un movimiento y un escalado de vistas desde la página de origen a la de destino, y viceversa cuando la navegación es hacia atrás. Lo único que hay que hacer, es instalar dicho paquete nuget tanto en el proyecto común como en los proyectos de cada plataforma de destino. Hay que tener en cuenta que, para que la navegación animada funcione, es necesario utilizar SharedTransitionNavigationPage en lugar del tradiccional NavigationPage ofrecido por Xamarin.Forms MainPage = new SharedTransitionNavigationPage(new MainPage()); Una vez hecho esto, estamos en condiciones de implementar la animación. Tanto en la Page de origen...

Clases de estilos en Xamarin.Forms
Se ha hablado largo y tendido sobre estilos en Xamarin.Forms , pero pocas son las referencias que he encontrado a las StyleClass . La gran ventaja del uso de StyleClass es que se pueden aplicar varias clases de estilos a un mismo control, lo que nos permite separar las distintas apariencias de un control en clases y aplicar una o varia al control dependiendo del aspecto final que deseemos aplicarle. La mejor forma de entender este funcionamiento es con un sencillo ejemplo. Para ello, he creado una aplicación sencilla que muestra dos BoxView y aplico distintos StyleClass a cada uno de ellos. A continuación se muestra la manera en la que he creado el estilo básico del BoxView y los distintos StyleClass que uso en la aplicación <Style TargetType="BoxView" <Setter Property="BackgroundColor" Value="Blue" / <Setter Property="HorizontalOptions" Value="Center" / <Setter Property="VerticalOptions" Value="Center" / </Style <Style TargetType="BoxView" Class="BigBox" <Setter Property="HeightRequest" Value="100" / <Setter...

Suma con acumulado en SQL Server
En este tip, os explicaré de forma rápida y sencilla cómo hacer una suma con acumulado en SQL Server, tal y como se muestra en las capturas que aparecen a continuación IMAGEN RESUMEN En el resultado se aprecia que, por cada fila, se muestra su Total además de la suma acumulada de éste teniendo en cuenta que la ordenación se realiza por Id . Para conseguirlo, se ha utilizado la siguiente query. select Id, Total, sum(sum(Total)) over (order by Id asc) as Accumulated from AccumulatedTest group by Id, Total Se ha utilizado SUM(SUM) , el primer sum suma la fila y el segundo genera el acumulado mediante el OVER. Con Order by se asegura el orden correcto en el que se quiere realizar la suma acumulada.

Home quick actions de iOS 13 en Xamarin.Forms
En esta ocasión os traigo un post en el que explico cómo añadir opciones a las acciones rápidas de una app iOS, tanto de manera estática como dinámica. Para añadir una opción de menú hay que definir su icono, título, subtitulo y tipo. Los iconos están prefijado y estos son todos los valores que se le pueden dar: - UIApplicationShortcutIconTypeAlarm - UIApplicationShortcutIconTypeAlarm - UIApplicationShortcutIconTypeAudio - UIApplicationShortcutIconTypeBookmark - UIApplicationShortcutIconTypeCapturePhoto - UIApplicationShortcutIconTypeCaptureVideo - UIApplicationShortcutIconTypeCloud - UIApplicationShortcutIconTypeCompose - UIApplicationShortcutIconTypeConfirmation - UIApplicationShortcutIconTypeContact - UIApplicationShortcutIconTypeDate - UIApplicationShortcutIconTypeFavorite - UIApplicationShortcutIconTypeHome - UIApplicationShortcutIconTypeInvitation - UIApplicationShortcutIconTypeLocation - UIApplicationShortcutIconTypeLove - UIApplicationShortcutIconTypeMail - UIApplicationShortcutIconTypeMarkLocation - UIApplicationShortcutIconTypeMessage - UIApplicationShortcutIconTypePause - UIApplicationShortcutIconTypePlay - UIApplicationShortcutIconTypeProhibit - UIApplicationShortcutIconTypeSearch - UIApplicationShortcutIconTypeShare - UIApplicationShortcutIconTypeShuffle - UIApplicationShortcutIconTypeTask - UIApplicationShortcutIconTypeTaskCompleted - UIApplicationShortcutIconTypeTime - UIApplicationShortcutIconTypeUpdate En la app de ejemplo que he desarrollado, hay 3 páginas y 3 opciones de menú, 2 añadidas de forma estática y 1 de forma dinámica. Cada una de las opciones, al pulsarse, abre...

Controlando el modo oscuro de iOS 13 en Xamarin.Forms
Antes de comenzar, comentaos que este post forma parte de una gran iniciativa ideada por Luis Beltrán (mi agradecimiento desde aquí). Y no es otra que un calendario de adviento en el que colaboramos la comunidad de Xamarin escribiendo un post o haciendo un video, cada día desde el 1 hasta el 28 de Diciembre. En este enlace, podéis ver todo el contenido que se ha generado para este calendario https://www.luisbeltran.mx/2019/11/06/primer-calendario-de-adviento-de-xamarin-en-espanol/ Un vez hecha la introducción, vamos a por el post que nos ocupa. Con la llegada de iOS 13, ha llegado a nuestros dispositivos el modo oscuro, por lo que, si queremos que nuestra app quede integrada con este nuevo modo, tenemos que hacer ciertas modificaciones. Hay controles q cambian su aspecto sin tener que hacer nada. Por ejemplo, un entry tiene su fondo de color blanco cuando nuestro dispositivo está en modo claro y, en cambio, su fondo...

Safe area de iPhones sin marcos en Xamarin Forms
Con este artículo comienzo una nueva categoría. Los he llamado tips y serán artículos muy cortos centrados en una funcionalidad específica. ¿Por qué voy a empezar a hacer este tipo de artículos? Muy sencillo. Llevo un tiempo en el que me cuesta más tiempo escribir posts elaborados, debido a que el día solo tiene 24h y gran parte de ellas las tengo ocupadas con varios quehaceres. No obstante, no quiero dejar de escribir en el blog, por lo que, creo que los tips me permitirán seguir generando contenido entre los post elaborados, que seguiré haciéndolos, aunque con una menor frecuencia. Una vez hecha esta introducción, vamos al lio. Hoy os quiero explicar algo muy sencillo pero igualmente necesario en nuestras aplicaciones. Esto es, el safe area de los iPhone. No es otra cosa que un pequeño espacio en las partes superior e inferior de los iphone sin marcos (PE: iPhone...

ActivityIndicator personalizado en Xamarin.Forms
En este post, os explicaré de forma sencilla cómo hacer un indicador de actividad simple para no tener que vernos obligados a utilizar el que ofrece Xamarin.Forms. Para hacerlo lo más sencillo posible, mi control solamente tendrá una imagen, la cual estará girando mientras esté corriendo. Además, tendrá una animación de escalado de 0 a 1 y viceversa que se lanzará cuando el indicador empiece a correr o se pare, respectivamente. Creando el control Lo primero que he hecho es crear un control y definir la animación de rotación en el constructor. private readonly Animation animation; private const string ANIMATION NAME = "ActivityIndicatorRotation"; public static readonly BindableProperty IsRunningProperty = BindableProperty.Create(nameof(IsRunning), typeof(bool), typeof(CustomActivityIndicator), false, propertyChanged: IsRunningChanged); public static readonly BindableProperty SourceProperty = BindableProperty.Create(nameof(Source), typeof(ImageSource), typeof(CustomActivityIndicator), default(ImageSource)); public CustomActivityIndicator() { InitializeComponent(); BindingContext = this; animation = new Animation(v = Rotation = v, 0, 360); } El siguiente paso ha sido crear 2...

Animaciones simples en Xamarin Forms
En esta ocasión traigo un post más que interesante. Para conseguir que una app guste a sus usuarios, no solo tiene que cumplir de forma correcta con su funcionalidad y hacerlo de una manera correcta, sino que debe ser atractiva, y para conseguirlo se deben utilizar animaciones en ciertos puntos de la app. En Xamarin Forms podemos encontrar algunas funciones simples, y si no es suficiente con ellas, podemos crear animaciones personalidad en las que el limite lo pone nuestra propia imaginación. En este post voy a centrarme en las animaciones simple, las cuales son un buen punto de partida para conseguir aplicaciones visualmente atractivas. Las animaciones simples que nos ofrece Xamarin Forms son para transladar, escalar, rotar y aplicar transparencia . Para realizar las animaciones hay disponibles una serie de métodos, que se detallan a continuación, pero cabe destacar que, además de los parámetros específicos de cada método en...

Lector de huellas en Xamarin Forms
Tras un largo periodo sin escribir nada, vuelvo a la carga con este interesante y sencillo post en el que voy a explicar como autenticar a un usuario mediante el lector de huellas (o face id en los iPhone que así realicen la autenticación) El proceso es tan sencillo que bastará con añadir un paquete nuget y escribir algo de configuración en las distintas plataformas. Con esto, nuestra aplicación estaría lista para realizar dicha autenticación. Añadiendo paquete Plugin.Fingerprint El paquete que se va a utilizar en este ejemplo es Plugin.Fingerprint cuya implementación la podemos encontrar en https://github.com/smstuebe/xamarin-fingerprint Es necesario añadir este paquete en los tres proyectos de nuestra solución (Android, iOS y común) Configurando Android Es necesario añadir los siguientes permisos en el AndroidManifest.xml <uses-permission android:name="android.permission.USE FINGERPRINT" / <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE USE APP FEATURE SURVEY" / Además, hay que añadir la siguiente línea en el MainActivity.cs para que el plugin sea...

Ama Xamarin desde todas las localizaciones
Antes de comenzar, he de decir que este post forma parte del mesxamarin, en concreto, del mes del amor y la amistad , lo cual es todo un orgullo para mí. Es una iniciativa de Universo Xamarin. Podéis encontrar todos los detalles del mes de febrero en este enlace. Además, encontraréis enlaces a otros 27 post relacionados con Xamarin. Uno por cada día del mes de Febrero. Escritos por unos cuantos apasionados de este framework que utilizamos en el desarrollo de nuestras apps. En esta ocasión, voy a hablar sobre cómo gestionar varias localizaciones en nuestra aplicación Xamarin. Muchas veces querremos que nuestra app soporte varios idiomas, incluso que muestre distintos recursos visuales en función de la configuración regional del dispositivo. Ambas cosas se pueden conseguir de una manera sencilla siguiendo los pasos que a continuación se detallan. El objetivo es implementar una aplicación que muestre el texto "Amo Xamarin"...

Tirggers en Xamarin Forms
El uso de triggers en Xamarin Forms permite expresar, en XAML, acciones que cambian la apariencia de controles en función de eventos o cambios en propiedades. A continuación, se detallan los tipos de triggers que se pueden encontrar/utilizar en Xamarin. Trigger de propiedades Se produce cuando, en un control, se da un valor determinado a una propiedad. Por ejemplo, si queremos que un entry tenga un background rojo si no se ha especificado ningún valor. Muy útil cuando se desea mostrar que un entry debe ser informado de manera obligatoria. <Entry Placeholder="write your name" Text="{Binding Name}" <Entry.Triggers <Trigger TargetType="Entry" Property="Text" Value="" <Setter Property="BackgroundColor" Value="Red" / <Setter Property="PlaceholderColor" Value="White" / </Trigger </Entry.Triggers </Entry En el ejemplo anterior, tenemos un entry con fondo rojo cuando su valor es una cadena vacía, y blanco cuando tiene otro valor. Trigger de datos Usa enlaces de datos para desencadenar basándose en los propiedades de otro...

Entry con navegación en Xamarin Forms
La mayoría de las veces, cuando desarrollo una aplicación Xamarin Forms en la que el usuario tiene que introducir datos, echo de menos poder indicar en el Entry cuál es el siguiente control. Con esto se conseguiría que el usuario pudiese ir pasando de un control a otro desde el teclado, sin necesidad de ir cambiando el foco manualmente. Dada esta necesidad, he decidido crear un proyecto con un control personalizado al que he llamado NavigableEntry, con el que se consigue vitaminar un Entry pudiendo definir cuál será el siguiente control. Para conseguirlo, lo único que he tenido que hacer es una clase que implemente un Entry y le dé la funcionalidad deseada. public class NavigableEntryControl : Entry { public static readonly BindableProperty NextViewProperty = BindableProperty.Create(nameof(NextView), typeof(View), typeof(Entry)); public View NextView { get = (View)GetValue(NextViewProperty); set = SetValue(NextViewProperty, value); } protected override void OnPropertyChanged([CallerMemberName] string propertyName = null) { base.OnPropertyChanged(propertyName);...

Login en google desde Xamarin Forms
Tras muchos intentos he conseguido implementar la autenticación de google en una app de Xamarin.Forms. Es mucha la documentación que hay para ofrecer esta funcionalidad en una aplicación web, en una aplicación nativa para Android e iOS, pero poco es lo que he encontrado asociado a Xamarin.Forms. Por tanto, he considerado interesante escribir este post. He divido la explicación en varios puntos - Configuración: tareas a realizar antes de ponernos a escribir líneas de código - Realizando autenticación: Implementación del grueso de las funcionalidades en el proyecto común de Xamarin.Forms - Implementación en Android: Tareas a realizar en el proyecto de dicha plataforma - Implementación en iOS: Tareas a realizar en el proyecto de dicha plataforma Configuración La primera configuración que hay que realizar es la de la consola de desarrollador de google - Ir a la consola del api e iniciar sesión - En el panel de control, añadir...

Recibiendo notificaciones push en Xamarin
En este post daré solución a un problema con el que he lidiado estos últimos días, y no es otro que la recepción de notificaciones push cuando estamos trabajando con Xamarin Forms. Hay varias alternativas para ello, pero yo me decanté por la utilización de App Center tras ver un vídeo en el que James Montemagno y Brandon Minnick hacen una rápida presentación de éste y un ejemplo sobre cómo usarlo en Android. A continuación detallo los pasos que he seguido para tener una app capaz de recibir notificaciones push tanto en iOS como en Android. Crear una cuenta en App Center En mi caso he accedido con mi cuenta de Microsoft. También se podría hacer con la de GitHub o crear una cuenta. Todas estas opciones están disponibles en https://appcenter.ms/ Crear apps en App Center Una vez que habéis creado una cuenta y os habéis logueado, es necesario crear...

Página base en Xamarin Forms
Cuando estamos desarrollando una aplicación, ya sea con Xamarin Forms o con cualquier otra tecnología, muchas de las páginas que tenemos que crear tienen partes en común, tanto en apariencia como en funcionalidad. Por lo que, es muy interesante, tener esa apariencia y funcionalidad junta, de tal forma, que no solo no habrá que implementarla una y otra vez en cada página, sino que, si se desea cambiar o corregir algún problema, no será necesario retocar todas y cada una de las páginas. A continuación, voy a mostrar un ejemplo en Xamarin Forms, en el que se va a crear una página base con un indicador de actividad. Asimismo, se creará otra página que "hereda" de esta primera con el fin de hacer ver, que no es necesario replicar ni una sola línea de código. Cabe destacar, que en el ejemplo he utilizado el patrón MVVM, por lo que también...

Compartiendo con nuget
Desde un punto de vista sencillo, un paquete NuGet es un archivo ZIP con la extensión .nupkg que contiene código compilado (archivos DLL), otros archivos relacionados con ese código y un manifiesto descriptivo que incluye información como el número de versión del paquete. Los programadores que desean compartir su código, pueden hacerlo creando este tipo de paquetes y publicándolos. Estos paquetes pueden ser alojados en un host público o privado, de esta manera, se puede limitar los destinatarios de un paquete. Así, se pueden crear paquetes visibles al mundo entero o, solamente, a tu organización. Para utilizar un paquete, simplemente hay que obtenerlo del host adecuado, agregarlo al proyecto y llamar a la funcionalidad de dicho paquete. Desde el propio visual studio se pueden controlar todos los detalles a la hora de trabajar con estos paquetes. En este post, lo que se pretende es mostrar lo sencillo que puede ser...

Conectividad en Xamarin Forms
Hace unos días, desarrollando una aplicación móvil en Xamarin, me encontré en una situación en la que necesitaba conocer si el dispositivo tenía conexión a Internet o no y qué tipo de conexión tenía, ya que de no ser WIFI era necesario mostrar un mensaje informativo al usuario, indicándole que se iba a realizar un proceso que requería de un alto consumo de datos. De está manera, el usuario podía decidir si realizar la acción, consumiendo su tarifa de datos, o prefería esperar a tener WIFI. Dados estos requisitos, lo primero que se me vino a la cabeza fue buscar si Xamarin.Essentials podría servirme de ayuda y...bingo!!, me proporcionaba justo la información que necesitaba, así que me puse manos a la obra. \ Para el que desconozca Xamarin.Essentials, simplemente decir que es un paquete Nuget que está desarrollando la propia Microsoft y que simplifica el trabajo en aplicaciones multiplataforma evitando...

Buscando información en BD SQL Server
Siempre que se empieza a trabajar con una base de datos que no se conoce, se requiere una curva de aprendizaje para averiguar donde se almacenan ciertos datos, ver de que manera se relacionan, saber si hay algún trigger, procedimiento, función...que utiliza una tabla o un campo... Esta curva de aprendizaje es imposible eliminarla, pero se puede reducir el tiempo invertido utilizando algunas queries que faciliten el trabajo. A continuación se detallan 3 de las que considero que más me han ayudado Buscar columnas en tablas y vistas Es útil cuando se quiere utilizar un campo (para leerlo o hacer alguna operación con él), se sabe que está en la base de datos, pero no dónde, en qué tabla o vista. SELECT COLUMN NAME AS 'ColumnName', TABLE NAME AS 'TableName' FROM INFORMATION SCHEMA.COLUMNS WHERE COLUMN NAME LIKE '%NOMBRE COLUMNA%' ORDER BY TableName, ColumnName Con la intención de mostrar un ejemplo,...

Creando una base de datos nueva con EF Core
.Net Core empieza a estar en auge y, con él, se está empezando a utilizar EF Core, por lo que la primera que pregunta que se nos plantea es '¿cómo puedo crear una base de datos en EF Core?' En este post voy a explicar de forma básica cómo se haría, creando una pequeña base de datos, definiendo las claves primarias y relaciones entre las distintas tablas. No entraré en detalles porque este post es básico y considero que puede ser objeteto de otro artículo entrar en detalles del modelado de la base de datos. En este ejemplo voy a crear una aplicación de consola, pero el ejemplo es extensible a otro tipo de proyecto. Añadir paquete nuget Para trabajar con EF core es necesario añadir el paquete nuget que se muestra en la siguiente imagen Crear entidades del modelo Una vez instalado el paquete nuget, se procede a crear...

Trazar cambios en entidades de EF Core
Hace unos días, me surgió la necesidad de crear una traza que contuviese todos los cambios que se iban realizando en una base de datos de EF. Tras mirar cómo se hacía en distintas aplicaciones, me centré en conseguir una aproximación similar a la que se hace en VSTS (Ahora conocido como Azure DevOps), el cual registra todos los cambios a nivel de propiedad, permitiendote ver el valor anterior y el valor nuevo. Conseguir esta traza no es muy complicado, aunque aviso de que la implementación que aquí voy a mostrar no traza inserciones ni borrados y traza los cambios de entidades que tienen un único campo como clave primaria. Una vez aclarado el alcance de la solución que voy a mostrar, vamos entrar en materia. A continuación detallo los pasos que he seguido. Crear modelo Para el ejemplo, se va a partir de un modelo con una única clase,...

Bienvenidos
¡¡Bienvenidos a mi blog!! Hace algún tiempo que tenía la idea de crear un blog y, de esta manera, aportar a la comunidad de desarrolladores un granito de arena plasmando aquí los conocimientos que tengo y voy adquiriendo. Este blog estará orientado, como habréis adivinado en el párrafo anterior, al desarrollo de software. Es posible que escriba sobre todo de tecnología .NET, ya que es la que utilizo en mi día a día, pero esto no quiere decir que si encuentro interesante un tema de otra tecnología no vaya a escribirlo. Sobre la periodicidad con la que voy a escribir...Intentaré hacerlo tanto como me sea posible, pero, en principio, no voy a fijarme una periodicidad Si os interesa, podéis seguirme en twitter y linkedin desde los enlaces que hay al pie de página. ¡¡Un saludo!!