martes, 31 de marzo de 2020
Como sabemos, hasta ASP.NET Core 2.2, registrábamos los servicios de MVC y Razor Pages en el método
¿Para qué sirven, y por qué ha sido necesario introducir estos nuevos extensores?
Sin embargo, la forma de registrar los servicios que hemos visto arriba, llamando a
Lo mismo ocurría si nuestra aplicación era MVC puro. Estábamos registrando servicios de Razor Pages que tampoco necesitaríamos. Y viceversa, en aplicaciones en cuya presentación usábamos únicamente páginas Razor estábamos introduciendo servicios propios de MVC.
Este aspecto es el que se solventa mediante la inclusión de esos nuevos extensores de
Publicado en Variable not found.
ConfigureServices()
de la clase Startup
con una línea como la siguiente:public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
...
}
Esto era todo lo que necesitábamos para poder utilizar cualquiera de estas tecnologías en nuestra aplicación. Sin embargo, a partir de ASP.NET Core 3.0, nuestro intellisense se vio inundado de opciones adicionales como AddControllers()
, AddRazorPages()
o AddControllersWithViews()
.¿Para qué sirven, y por qué ha sido necesario introducir estos nuevos extensores?
En busca de la modularidad
Desde sus comienzos, ASP.NET Core fue presentado como un framework modular, huyendo de monolitos como ASP.NET "clásico", en el que todas las funcionalidades estaban incrustadas enSystem.Web
y no había forma de utilizarlas de forma separada.Sin embargo, la forma de registrar los servicios que hemos visto arriba, llamando a
services.AddMvc()
, no parecía demasiado alineada con esa intención inicial. Esta llamada registraba todos los servicios relativos a la gestión de vistas MVC, así como a las páginas Razor. Aunque nuestra aplicación fuera únicamente en una API y no tuviese vistas, estábamos registrando bastantes servicios que no íbamos a necesitar.Lo mismo ocurría si nuestra aplicación era MVC puro. Estábamos registrando servicios de Razor Pages que tampoco necesitaríamos. Y viceversa, en aplicaciones en cuya presentación usábamos únicamente páginas Razor estábamos introduciendo servicios propios de MVC.
Este aspecto es el que se solventa mediante la inclusión de esos nuevos extensores de
IServiceCollection
.-
AddControllers()
registra los servicios absolutamente necesarios para que funcionen los controladores, y nada relativo a vistas o páginas Razor. Esto incluye los servicios de autorización, soporte para formateadores, CORS, anotaciones de datos, el application model, mecanismos de selección de acciones, servicios de binding, etc.
Este el método de registro ideal para backends que sólo actúan como API.
-
AddControllersWithViews()
registra adicionalmente los servicios requeridos para poder ejecutar vistas MVC. Aparte de los servicios añadidos porAddControllers()
, registra el soporte para vistas, helpers, view engines, Razor y algunos tag helpers básicos.
Este es el extensor que debemos elegir si nuestra aplicación utiliza todas las piezas del MVC "tradicional".
-
AddRazorPages()
introduce en el contenedor de dependencias los servicios necesarios para ejecutar Razor Pages, pero no vistas MVC. Curiosamente, también registra los servicios de controladores porque internamente Razor Pages está montado sobre MVC y se basa en algunas de sus funcionalidades.
Es la opción ideal si vamos a programar las páginas de nuestro sitio web utilizando esta tecnología.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews()
.AddRazorPages();
...
}
Por último, es importante saber que AddMvc()
sigue funcionando como en versiones anteriores. De hecho, internamente llama consecutivamente a AddControllersWithViews()
y a AddRazorPages()
, por lo que sería equivalente al código anterior. Milagros de la retrocompatibilidad ;)Publicado en Variable not found.
2 Comentarios:
Hola soy juan y te agradezco y felicito por el gran aporte haces. Muchos de tus artículos me han sido de mucha ayuda. te mando un saludo grande desde buenos aires y gracias otra vez !!
Hola, Juan!
Encantado de tenerte por aquí, me alegra saber que los contenidos te son de utilidad :)
Y muchas gracias por tu comentario!
Enviar un nuevo comentario