A continuación se indican tres razones principales por las que resulta beneficioso utilizar Entity Framework (EF) para los comandos y Dapper para las consultas SQL en un proyecto de API web ASP.NET aprovechando el patrón CQRS y la biblioteca MediatR:
1) Separación de responsabilidades. EF se destaca en la gestión de modelos de dominio, el manejo de relaciones de objetos complejas y el seguimiento de estados de entidades para comandos (Crear, Actualizar, Eliminar).
Dapper es ligero y está altamente optimizado para ejecutar consultas SQL de solo lectura, lo que lo hace ideal para el lado de consulta de CQRS donde el rendimiento es fundamental.
2) Optimización del rendimiento
El seguimiento de cambios y las funciones avanzadas de EF pueden generar sobrecarga, especialmente en consultas simples. El uso de Dapper para consultas elimina este problema, ya que Dapper es un micro ORM optimizado para un acceso rápido y directo a la base de datos. En el caso de los comandos, la gestión de transacciones y el seguimiento de cambios integrados de EF simplifican el manejo de actualizaciones sin necesidad de instrucciones SQL manuales, que pueden ser propensas a errores.
3) Flexibilidad y facilidad de mantenimiento
Dapper permite escribir consultas SQL sin formato con un control total, lo que resulta perfecto para proyecciones personalizadas y uniones adaptadas a las respuestas de API. EF se alinea bien con los principios de diseño basados en el dominio, lo que garantiza que los comandos permanezcan limpios y centrados en las reglas de negocio en lugar de en operaciones de base de datos de bajo nivel.
Esta combinación aprovecha las fortalezas de cada ORM, garantizando un alto rendimiento y una arquitectura de código limpia dentro de un sistema basado en CQRS.
El entorno de desarrollo multiplataforma .NET MAUI representa un avance significativo en la creación de aplicaciones móviles, proporcionando una solución unificada para desarrollar en Android, iOS, macOS y Windows con una sola base de código. Esto no solo optimiza el tiempo de desarrollo y mantenimiento, sino que también facilita la implementación de una interfaz de usuario consistente y nativa en cada plataforma. Integrado con el robusto ecosistema de herramientas de Microsoft, como Visual Studio, .NET MAUI ofrece potentes capacidades de depuración y diseño. Sin embargo, la adopción de .NET MAUI requiere familiaridad con el stack tecnológico de Microsoft y puede no siempre igualar el rendimiento de las aplicaciones nativas en casos de uso específicos. A pesar de estas consideraciones, .NET MAUI es una opción atractiva para desarrolladores que buscan eficiencia y flexibilidad en el desarrollo multiplataforma.
En esta entrada vamos a dar cinco razones para usar .NET MAUI (Multi-platform App UI) en el desarrollo de aplicaciones móviles:
Desarrollo Multiplataforma Unificado: .NET MAUI permite a los desarrolladores crear aplicaciones para Android, iOS, macOS y Windows desde una única base de código. Esto significa que puedes escribir tu lógica de aplicación y la interfaz de usuario una sola vez y desplegarla en múltiples plataformas, lo cual ahorra tiempo y esfuerzo en el desarrollo y mantenimiento.
Interfaz de Usuario Consistente: .NET MAUI proporciona un conjunto de controles de interfaz de usuario que son nativos para cada plataforma, lo que garantiza una apariencia y comportamiento consistente y de alta calidad. Al mismo tiempo, permite personalizar la apariencia para ajustarse a las directrices específicas de cada plataforma si es necesario.
Ecosistema y Herramientas de .NET: Al ser parte del ecosistema .NET, MAUI se beneficia de las robustas herramientas de desarrollo de Microsoft, como Visual Studio, que ofrece potentes funcionalidades de depuración, diseño de interfaces, y administración de proyectos. Además, puedes aprovechar bibliotecas y paquetes NuGet disponibles en .NET, lo que facilita la integración de funcionalidades adicionales.
Código Compartido y Reutilización: .NET MAUI permite la reutilización de una gran cantidad de código entre plataformas. Esto no solo incluye la lógica de negocio, sino también componentes de la interfaz de usuario a través de XAML y C#. Esta capacidad de compartir código reduce la duplicación de esfuerzos y hace que la gestión del código sea más sencilla y eficiente.
Rendimiento y Acceso a Funcionalidades Nativas: .NET MAUI se basa en Xamarin.Forms, pero ofrece mejoras en rendimiento y acceso directo a funcionalidades nativas. Puedes escribir código específico de la plataforma cuando sea necesario utilizando C# y aprovechar APIs nativas, lo cual permite crear aplicaciones con un rendimiento cercano al nativo.
Estas razones hacen de .NET MAUI una opción atractiva para desarrolladores que buscan crear aplicaciones móviles robustas, eficientes y con una amplia cobertura de plataformas utilizando una única tecnología y base de código. mapa
Como sabemos AWS ofrece una amplia gama de servicios para diversas necesidades proporciona soluciones escalables para negocios de todos los tamaños y sus centros de datos globales aseguran alta disponibilidad y baja latencia. Además tiene acceso gratuito a muchos servicios. Por estas razones escribimos esta entrada con los pasos para publicar directamente usando el AWSToolKit desde Visual Studio.
En la entrada «Arquitectura microservicios y .Net core» describimos qué y por qué el interés de este tipo de arquitectura. Una de las ventajas que se mencionaron es el desacoplamiento de estos microservicios, pero entonces ¿cómo se comunican estos microservicios desacoplados? Aquí entra los messages brokers.
Los message brokers, como RabbitMQ, son esenciales en arquitecturas de microservicios para facilitar la comunicación entre los diferentes componentes de la aplicación. Actúan como intermediarios eficientes, permitiendo que los microservicios se comuniquen de manera asíncrona y desacoplada. Su capacidad para encolar y distribuir mensajes garantiza una alta disponibilidad y escalabilidad, lo que es crucial en entornos de microservicios dinámicos. RabbitMQ proporciona una variedad de patrones de mensajería, como pub/sub, colas de trabajo y enrutamiento de mensajes, adaptándose a diversas necesidades de comunicación. Al desacoplar la emisión y recepción de mensajes, los microservicios pueden evolucionar de manera independiente, sin afectar a otros componentes del sistema. La durabilidad y la persistencia de los mensajes en RabbitMQ aseguran que los datos críticos no se pierdan en caso de fallo o interrupción.
Además, RabbitMQ ofrece características de encriptación y autenticación, garantizando la seguridad de la comunicación entre los microservicios. Facilita la implementación de patrones de tolerancia a fallos, como la reintentación de mensajes y la gestión de errores, mejorando la robustez del sistema. Permite la implementación de sistemas distribuidos altamente disponibles, donde los microservicios pueden escalar horizontalmente para manejar cargas variables. Su arquitectura modular y extensible permite integrarlo fácilmente con otros servicios y herramientas utilizadas en el ecosistema de microservicios. RabbitMQ ofrece monitoreo y herramientas de administración que permiten supervisar el rendimiento y la salud de la infraestructura de mensajería. Facilita la implementación de patrones de entrega garantizada y consistencia eventual, lo que es fundamental en aplicaciones distribuidas. Al promover la comunicación basada en eventos, RabbitMQ facilita la implementación de arquitecturas orientadas a eventos, que son adecuadas para sistemas altamente escalables y resilientes. Su amplia adopción y comunidad activa proporcionan soporte continuo y recursos de aprendizaje para los equipos de desarrollo. En resumen, el uso de RabbitMQ como message broker en arquitecturas de microservicios ofrece una serie de beneficios que incluyen escalabilidad, robustez, flexibilidad y seguridad, lo que lo convierte en una herramienta invaluable para el desarrollo de software moderno.
Tres desafíos o inconvenientes al utilizar un message broker como RabbitMQ en software de microservicios:
Complejidad en la gestión y configuración: Configurar y administrar un message broker como RabbitMQ puede ser complejo, especialmente en entornos de microservicios donde hay múltiples instancias ejecutándose y comunicándose entre sí. La configuración de las colas, los intercambios, los enrutamientos y otros aspectos puede requerir un conocimiento profundo de la herramienta y de las mejores prácticas de arquitectura.
Rendimiento y latencia: Aunque los message brokers son una solución eficaz para la comunicación entre microservicios, pueden introducir latencia adicional en las comunicaciones debido al procesamiento y enrutamiento de los mensajes. En entornos donde la latencia es crítica, como aplicaciones de alta velocidad o tiempo real esta sobrecarga puede ser un desafío y requerir optimizaciones adicionales.
Complejidad en el manejo de errores y garantía de entrega: Aunque los message brokers ofrecen mecanismos para garantizar la entrega de mensajes, como confirmaciones y reintentos, gestionar adecuadamente los errores y las situaciones de error puede ser complicado. Los mensajes pueden perderse, duplicarse o entregarse en el orden incorrecto, lo que requiere estrategias de manejo de errores robustas y pruebas exhaustivas para garantizar la integridad de los datos y la fiabilidad del sistema.
La autenticación es un aspecto crucial de la seguridad de las aplicaciones web. Garantiza que los usuarios sean quienes dicen ser antes de otorgarles acceso a recursos o funcionalidades específicas. Un método popular de autenticación en el desarrollo web moderno son los JSON Web Tokens (JWT). En esta entrada, exploraremos cómo implementar la autenticación de token JWT en la web api de localización de establecimientos de farmacia.
Entonces al controlador o método que queramos añadir que sean solicitudes autenticadas añadimos la cabecera [Autorize] y creamos otro control en le que escribimos la lógica de autenticación:
[HttpPost]
public IActionResult Post([FromBody] LoginRequest loginRequest)
{
//If login email and password are correct then proceed to generate token
var email = loginRequest.Email;
var password = loginRequest.Password;
if (email == "email" && password == "password")
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var Sectoken = new JwtSecurityToken(_config["Jwt:Issuer"],
_config["Jwt:Issuer"],
null,
expires: DateTime.Now.AddMinutes(120),
signingCredentials: credentials);
var token = new JwtSecurityTokenHandler().WriteToken(Sectoken);
return Ok(token);
}
return Unauthorized();
}
Así con JWT es un medio compacto y seguro para URL para representar identificaciones que se transferirán entre dos partes. Estos identificadores se pueden firmar digitalmente, lo que los convierte en una forma segura de autenticar y transmitir información entre el cliente y el servidor. Los tokens JWT se utilizan a menudo para: Autenticación sin estado, autenticación entre orígenes distintos, escalabilidad.
En resumen, podemos decir que, la identificación en APIs RESTful es esencial para garantizar la seguridad. JSON Web Tokens (JWT) se ha convertido en una elección popular para este propósito. Al implementar JWT, la información de identificación del usuario se codifica en un token firmado digitalmente, que luego se envía con cada solicitud. Esto permite a los servidores verificar la autenticidad y autorización de cada solicitud de manera eficiente. Los JWT contienen información como el ID del usuario y roles, facilitando la validación en el servidor sin necesidad de consultar la base de datos en cada solicitud. Además, la expiración del token proporciona una capa adicional de seguridad. En resumen, JWT simplifica la gestión de identidades en APIs RESTful, mejorando la eficiencia y seguridad del sistema.