Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 31 de marzo de 2020
ASP.NET Core Como sabemos, hasta ASP.NET Core 2.2, registrábamos los servicios de MVC y Razor Pages en el método 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() 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 en System.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 por AddControllers(), 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.
Estos métodos pueden combinarse de forma que sumemos posibilidades. Por ejemplo, el siguiente código registraría los servicios para una aplicación en la que utilizaremos vistas MVC y Razor Pages:
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:

Juan Pacheco dijo...

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 !!

José María Aguilar dijo...

Hola, Juan!

Encantado de tenerte por aquí, me alegra saber que los contenidos te son de utilidad :)

Y muchas gracias por tu comentario!