Agregando la clase Startup en ASP.NET Core 6.
Tags: net6, startup, webdev, dotnet
Published: 2021-12-01 02:12:02

En noviembre del 2021, **.NET 6** se convierte oficialmente en el nuevo framework de Microsoft el cual nos permite desarrollar aplicaciones que abarcan distintas áreas para direfentes plataformas. Una de esas áreas es la web con ASP.NET Core.

ASP.NET Core en .NET 6 incluye algunas novedades. Una de ellas, es la nueva forma de configurar el punto de partida de las aplicaciones web. 

Hasta ASP.NET Core 5, el lugar elegido para escribir código de inicialización era en una clase llamada Startup. Aquí se configuraban algunos aspectos como los middlewares y la inyección de dependencias. Esta clase debía cumplir con ciertos requisitos para que el framework de ASP.NET Core pueda ejecutarse sin problemas.

### Nuevo modelo de configuración.

El nuevo enfoque de configuración en ASP.NET Core 6 es llamado "modelo de hosting mínimo" donde se unifica los archivos **Startup.cs** y **Program.cs** en un único archivo **Program.cs**.

Al momento de crear una aplicación ASP.NET Core 6, nos damos cuenta de que el archivo **Startup.cs** no existe. Es el archivo **Program.cs** el que contiene todo el código de inicialización, inyección de dependencias, y configuración del HTTP request pipeline también conocido como midleware.

![Program](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4kurossdtr10w5a6gdfj.PNG)

### Reviviendo la clase Startup en el nuevo modelo de hosting mínimo.

Personalmente creo que la clase Startup tenía gran valor porque nos permitía mantener por separado y mejor organizado la configuración de los servicios y los midlewares. A continuación veremos cómo podemos traerla de vuelta.

Antes de empezar, debemos de comprobar que tenemos instalado la versión más reciente del **.NET 6**. Podemos utilizar el siguiente comando en la terminal de cualquier plataforma (Windows, Linux, MacOS).

```
~$ dotnet --version
```

Si no lo tenemos instalado, podemos descargar el SDK [aquí](https://dotnet.microsoft.com/download/dotnet/6.0).

Como segundo paso, vamos a crear un proyecto en ASP.NET Core 6. En este ejemplo, crearemos una aplicación Web API. Podemos crearla utilizando Visual Studio 2022 o mediante la línea de comandos con el [dotnet CLI](https://docs.microsoft.com/en-us/dotnet/core/tools/) como veremos a continuación.

```
~$ dotnet new wepapi -o WebApi6
```

Este comando nos crea un proyecto de ASP.NET Core Web API en la carpeta WebApi6 el cuál también será el nombre del proyecto utilizando el framework .NET 6.

Luego, crearemos un archivo llamado **Startup.cs** en la raíz de nuestro proyecto.

![Startup](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kmlw4omhss9y7yqmfqpz.PNG)

Con nuestro archivo Startup creado, vamos agregar código de forma similar a lo que ya teníamos en las versiones anteriores. 

![Startup](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kawrly3ona1zljqpv0e3.PNG)

Agregamos un constructor que recibe como parámetro el <code>IConfiguration</code> que nos permitirá leer configuraciones de distintos orígenes en el formato clave-valor. También agregamos un método <code>void</code> llamado <code>ConfigureServices</code> que recibe como parámetro el <code>IServiceCollection</code>. Esta interfaz nos permitirá hacer uso del principio de inversion de dependencias, donde podemos hacer que nuestras clases dependan de abstracciones y no tipos concretos.
Por último un método <code>Configure</code> donde recibirá <code>IApplicationBuilder</code> y <code>IWebHostEnvironment</code> como parámetros. Este método también es de tipo <code>void</code>. 

Ahora, vamos a hacer un refactor de nuestro archivo **Program.cs**. El código relacionado a la configuración de los servicios lo movemos al método <code>ConfigureServices</code> de la clase **Startup** y reemplazamos <code>builder.Services</code> por <code>services</code>.

Archivo **Program.cs**
![Program](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6r0jcf2wcquwdblh68vm.PNG)

Archivo **Startup.cs**
![Startup](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9dlxe3jtng43gqpgbpyo.PNG)

Luego, movemos la sección del código referente a la configuración del HTTP request pipeline hacia el método <code>Configure</code> de la clase <code>Startup</code>.

Archivo **Program.cs**
![Program](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qnui5puiv0hia9hcgypv.PNG)

Archivo **Startup.cs**
![Startup](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g4lbyaciuruenygingtl.png)

Después de copiar el código al método <code>Configure</code>, nuestro editor nos mostrará unos errores, por lo que tendremos que hacer un pequeño refactor tal como se muestra en la imagen de arriba.

¡Ahora el código de la clase <code>Program</code> quedó más compacto!

![Program](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jum5klr76rd8iaj2am7p.PNG)

Por último, es necesario utilizar nuestra clase <code>Startup</code> en la clase <code>Program</code>. Para ello, vamos a instanciarla pasándole como parámetro <code>builder.Configuration</code>. Luego, llamaríamos al método <code>ConfigureServices</code> enviándo como parámetro <code>builder.Services</code>. Después de construir la applicación con <code>var app = builder.Build();</code>, invocamos al método <code>Configure</code> donde pasamos como parámetros a <code>app</code> y <code>app.Environment</code>. Nuestro código quedaría finalmente así en la clase **Program**.

![Program](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d0swsl709joloj2xygk7.PNG)

###Conclusión.

A pesar de que ASP.NET Core 6 no nos proporciona la clase Startup, hemos visto un modo de cómo agregarla. Cabe mencionar que este proceso no es requerido. Es sólo una forma de cómo mantener nuestro código organizado y también puede ser de ayuda si estamos migrando desde versiones anteriores de ASP.NET Core.

###Referencias:

- https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-6.0

- https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60?view=aspnetcore-6.0&tabs=visual-studio