Muchas veces se enlaza C# como un lenguaje que no es popular para hacer aplicaciones de una forma rápida, debido a que es fuertemente tipado y a que en parte se utiliza en empresas multinacionales, donde por algún motivo, que no comprendo, eso significa que no se puede hacer software rápido.
Una de las pegas que dicen que tiene es que debemos crear todo el apartado de administración de forma manual, lo que implica mucho tiempo, cosa que no sucede igual en otros lenguajes como ruby, donde añades una gema (equivalente a librerías) y de repente tienes todo la parte de administración de la base de datos en un par de líneas de código con ActiveAdmin
.
En este post, vamos a explorar la librería EasyData para .NET.
1 - ¿Qué es EasyData?
Easydata es una librería que en .NET nos permite crear una interfaz para acceder a la base de datos desde el front end.
Puedes pensar que realizar esta acción es una locura, la verdad es que no lo es, la gran mayoría de startups, por no decir todas, se concentran en dar valor al usuario, en permitir desde el front end crear elementos, modificarlos, etc, lo que sea que hace la app y únicamente se programa la implementación del usuario. Pero muchas veces cometen errores, y esos errores no se pueden deshacer por el propio usuario.
Por ejemplo en una aplicación tipo Airbnb, eliminar una de tus habitaciones, quizá te has equivocado y querías borrar otro, desde la parte de usuario no puedes hacer nada y tienes que crearlo otra vez, perdiendo todo el historial, etc.
En cambio, hay otra opción, llamar a soporte y ver si lo pueden arreglar.
Asumiendo que nadie hace hard deletes a estas alturas de la vida, la persona de soporte puede decir que sí, que se puede arreglar pero que tardará un tiempo. El motivo es simple, hay que meterse en el servidor de la base de datos y ejecutar un comando de forma manual.
Pero hay otra opción, tener un front end, de acceso interno, donde podemos controlar esta información. Aquí es donde entra EasyData, o ActiveAdmin si utilizas Ruby.
2 - Implementar EasyData en C#
Para este ejemplo vamos a añadir la librería a un código existente, obviamente se puede añadir a un proyecto nuevo, pero siempre es mejor verlo con uno existente.
Para este ejemplo veremos el código de mi libro la Guía completa de desarrollo full stack con .NET. Donde tenemos una web que podemos crear feature flags.
Como vemos en la imagen, podemos crear flags, editar y eliminarlas, lo que sería un CRUD. Pero por ejemplo si eliminamos una Feature Flag, ya no tenemos forma de volver a activarla.
En este ejemplo no es un problema muy grande, pues una feature flag es sencilla de reemplazar, pero si tienes descripciones de hoteles que te ha llevado horas o tienes estadísticas de mucho tiempo en el pasado, puede ser un problema.
Así que lo que debemos hacer es instalar la librería de EasyData, en concreto dos paquetes que podemos descargar desde NuGet.
EasyData.AspNetCore
EasyData.EntityFrameworkCore.Relational
Después de instalar estos dos paquetes, queda una pequeña parte de configuración, que viene siendo añadir el middleware de EasyData a la configuración de la app:
app.MapEasyData(options => {
options.UseDbContext<ApplicationDbContext>();
});
Y por supuesto una página para que renderize la vista con el contenido a mostrar, por lo que tenemos que crear el controlador y la vista:
[Route("easydata")]
public class EasyDataController : Controller
{
private readonly ILogger<EasyDataController> _logger;
public EasyDataController(ILogger<EasyDataController> logger)
{
_logger = logger;
}
[Route("{**entity}")]
public IActionResult Index(string entity)
{
if (string.IsNullOrEmpty(entity))
{
_logger.LogInformation("Index page");
}
else
{
_logger.LogInformation($"{entity} page");
}
return View();
}
}
@{
ViewData["Title"] = "Entities";
}
<div id="EasyDataContainer"></div>
@section Scripts {
<link rel="stylesheet" href="https://cdn.korzh.com/ed/1.4.18/easydata.min.css" />
<script src="https://cdn.korzh.com/ed/1.4.18/easydata.min.js" type="text/javascript"></script>
<script>
window.addEventListener('load', function () {
new easydata.crud.EasyDataViewDispatcher().run()
});
</script>
}
Nota: este ejemplo es con MVC, pero si usas Blazor, razor o incluso React en el front end tienes diferentes opciones y está todo documentado en el GitHub oficial.
Con esto ya podemos acceder a la url /easydata donde por defecto tendremos acceso a todas las entidades de nuestra aplicación.
Y ya está, ahora podemos acceder a cada una de las entidades de forma individual.
Ojo, esta página en este ejemplo no tiene autenticación y habría que ponerle, pero en cualquier caso, cuando modificas una entidad, lo estás haciendo directamente en la base de datos, lo que implica que te estás saltando todas las reglas de negocio que tengas en el código y solo se ejecutará aquella lógica que esté en el DbContext.
Si accedemos a una de las entidades podemos ver que nos carga la lista completa:
Nota: por propósito de la demo he eliminado el siguiente código del DbContext:
modelBuilder.Entity<FlagEntity>()
.HasQueryFilter(a => !a.IsDeleted
&& a.UserId == flagUserDetails.UserId);
Desde aquí, podemos hacer las operaciones CRUD directamente donde únicamente cumpliremos las reglas de la base de datos y las entidades, por lo que obviamente no utilizaremos esto para los clientes, sino de forma interna para los administradores o el equipo interno.
Sus funcionalidades no acaban aquí, de hecho tiene unas cuantas, las cuales las tienes disponibles en su GitHub pero por mencionar las mas importantes pueden ser, diferentes formatos para fechas o decimales, ignorar entidades para no poder ser modificadas, ocultar propiedades de algunas entidades o incluso cambiarles el nombre que veremos en la interfaz.
3 - Es EasyData lo que necesitas?
Saber si la aplicación que estás creando lo que necesita es easydata o similares pues depende, la gran ventaja que tiene utilizar esta librería es que te permite centrarte únicamente en la lógica del usuario y en dar valor a dichos usuarios, dejando toda la parte de administración de una forma sencilla pero completamente funcional.
Obviamente no te va a servir en todos los procesos, supón que trabajas en una tienda y alguna vez descuadra el almacén, puedes crear una interfaz para arreglar el stock, lo que lleva tiempo de implementar y mantener con toda la lógica, o puedes meterle EasyData y realizar los cambios de forma manual en segundos. Todo depende de que parte de tu sistema quieras priorizar.
Puedes pensar que es muy arriesgado, pero la realidad es que AirBnB utilizaba ActiveAdmin (la alternativa a EasyAdmin en Ruby) hasta hace relativamente poco, cuando ya estaba valorada en varios miles de millones, y creeme, si ellos podían usarlo, tu también.