Ultimamente me han preguntado sobre la relación y diferencia entre ASPNET Core y ASPNET MVC Core, sobretodo, un tema que veo ha generado confusión es que los dos temas anteriores no son lo mismo, y es posible usar ASPNET Core sin tener ASPNET MVC Core en la misma aplicación.


Así que para entender la diferencia, lo primero es entender que ahora ASPNET Core ha sido creado para ser modular, construido con OWIN en mente, por lo tanto, podemos definir que ASPNET Core es tan solo un gran contenedor, contenedor en el cual podemos conectar diferentes componentes (conocidos como Middleware) y hacer uso de ellos, y uno de esos middlewares disponible es precisamente mvc (bueno sí, aspnet mvc).

ASPNET Core Pipeline

En la gráfica anterior se muestra mejor el caso, podemos añadir 1 o más middleware al pipeline de ASPNET Core, y uno de esos middleware puede ser mvc, pero no es estrictamente necesario.

Te recomiendo darle una mirada al post de @eiximenis: http://geeks.ms/etomas/2016/02/29/creating-middlewares-de-asp-net-core/ para entender más de que va eso de los middlewares.


Para entender un poco mejor la diferencia, vamos a crear un proyecto, seleccionando la plantilla Empty en ASPNET 5 Templates, en dicho proyecto, observemos las referencias que se tienen en el archivo project.json:


"dependencies": {
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final"
},

En dichas referencias por ningún lado aparece MVC, ahora, la configuración de los middlewares, servicios, etc se realiza en el archivo Startup.cs que es la clase/punto de entrada de OWIN, allí vamos al método Configure, y en la línea app.Run(...) tenemos el middleware por defecto que se crea, el cuál tan solo retorna un texto, el código original luce:


public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World!");
    });
}

Antes de validar, recordemos que comentamos más arriba que podemos tener uno o más middlewares, así que vamos a añadir uno nuevo, esto lo hacemos usando app.Use(....), es importante en el middleware pasar la ejecución al siguiente middlware y esto se hace definiendo un segundo parámetro en el delegado:


public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();

    app.Use(async (context, next) => 
    {
        await context.Response.WriteAsync("Hello form Middleware 1!");
        await next();
    });

    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello from Middleware 2!");
    });
}

En este momento, si ejecutamos efectivamente obtenemos los dos textos definidos (si, en el demo son texto, pero puedes tener lo que quieras):

Ejecución App

A este punto ya tenemos nuestra aplicación ASPNET Core funcionando sin necesidad de usar ASPNET MVC... pero, y si quiero usar MVC?

Lo primero que debemos hacer es añadir la referencia a Microsoft.AspNet.Mvc en el project.json


"dependencies": {
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc" : "6.0.0-rc1-final"
},

Volvemos a la clase Startup.cs en la cual debemos hacer dos cosas:

  • Añadir los servicios en el método ConfigureServices
  • Configurar el servicio de MVC en el método Configure

Realizando los dos pasos anteriores:


public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseIISPlatformHandler();

        app.UseMvcWithDefaultRoute();
    }

    public static void Main(string[] args) => WebApplication.Run(args);
}

En este caso hemos usado app.UseMvcWithDefaultRoute(); para registrar y configurar MVC con el routing por defecto, si el tradicional que veiamos desde siempre como {controller}\{action}\{id}, y en este punto te recomiendo el post Routers en ASPNET Core de nuevo por @eiximenis.


Bueno, y para terminar y ver que efectivamente MVC funciona sin problema, creamos una carpeta Controllers, agregamos un nuevo controllador HomeController y en este caso retornamos un texto desde la acción Index del controlador:


public class HomeController : Controller
{
    public IActionResult Index()
    {
        return Content("Hello from ASPNET MVC Core!");
    }
}

Y si ejecutamos de nuevo...

Hello ASPNET MVC Core

Espero les sea interesante el post, y no se olviden de compartirlo.

Saludos!