En este post vamos a analizar otra característica nueva incluida en ASP.NET Core: El soporte para controlar el comportamiento de nuestra aplicación en múltiples ambientes a través del uso de variables de entorno.

Es muy común que necesitemos especificar ciertos comportamientos en nuestra aplicación dependiendo del ambiente usado. Un modelo muy usual en los proyectos de software es tener ambiente de desarrollo, de pruebas o staging y ambiente de producción. Pues bien, en ASP.NET Core podemos hacer uso de una variable de entorno con el nombre ASPNET_ENV para indicar el ambiente en el que nuestra aplicación está ejecutándose. Con esta variable podemos chequear ciertos valores que nos proponen por convención o bien podemos usar nuestro propio nombre de ambiente.

Inicialmente tenemos las convenciones propuestas para el valor de la variable ASPNET_ENV por el equipo de producto de ASP.NET, que son:

  • Ambiente de desarrollo: Development
  • Ambiente de pruebas: Staging
  • Ambiente de producción: Production

Vamos a ver un ejemplo a continuación para entender mejor esto. En un proyecto ASP.NET Core vamos a agregar un controlador MVC con el siguiente código:

public class HomeController : Controller
{
    private IHostingEnvironment _environment;
 
    public HomeController(IHostingEnvironment environment)
    {
        _environment = environment;
    }
    public IActionResult Index()
    {
        if (_environment.IsDevelopment())
        {
            // ASPNET_ENV = Development
            ViewData["environment"] = "Desarrollo";
        }
        else if (_environment.IsStaging())
        {
            // ASPNET_ENV = Staging
            ViewData["environment"] = "Pruebas - Staging";
        }
        else if (_environment.IsProduction())
        {
            // ASPNET_ENV = Production
            ViewData["environment"] = "Produccion";
        }
        else if (_environment.IsEnvironment("MiAmbiente"))
        {
            // ASPNET_ENV = MiAmbiente
            ViewData["environment"] = "Mi ambiente";
        }
        else
        {
            // ASPNET_ENV = ?
            ViewData["environment"] = "Otro ambiente :P";
        }
 
        return View();
    }
}

Notemos dos cosas en este código: la inyección de dependencias mediante el constructor de la interface IHostingEnvironment, la cual usamos para evaluar el ambiente actual con los métodos de extensión IsDevelopment, IsStaging y IsProduction (estos verifican los nombres propuestos en la convención mencionada anteriormente) o mediante el método IsEnvironment para verificar otro nombre que no corresponda a la convención.

Luego adicionamos también una vista muy sencilla para imprimir el valor de la variable que estamos asignando al ViewData en el controlador del código anterior

@{
    ViewData["Title"] = "Home Page";
}
<br />
<p>El ambiente actual es: @ViewData["environment"]</p>

Por último, vamos a configurar el valor de la variable de entorno ASPNET_ENV. Esto lo realizamos desde las opciones del proyecto, haciendo click derecho sobre el proyecto ASP.NET Core en Visual Studio.

coreenvironments01

coreenvironments02

Vamos a ejecutar la solución de ejemplo que creamos, y a continuación veremos los resultados con cada uno de los valores de la variable de entorno

Para ambiente de desarrollo:

coreenvironments03

Para ambiente de staging:

coreenvironments04

Para ambiente de producción:

coreenvironments05

Para un ambiente con nombre diferente:

coreenvironments06

Así podemos ver pues con el ejemplo ASP.NET Core nos facilita la gestión en el código del comportamiento de nuestra aplicación de acuerdo al ambiente en el que se encuentre.

Por último, un tip adicional: Cuando no estamos usando Visual Studio, bien sea porque estamos desarrollando sin él o porque estamos configurando un servidor, el valor de la variable de entorno se puede configurar en el sistema operativo.

Es todo por este post. Aún hay un par de aspectos sobre este tema de múltiples ambientes que vamos a ver en futuros posts. No olvides dejar tus inquietudes o comentarios. Recuerda también visitar la documentación oficial sobre el tema si quieres verlo más a fondo.

El código del ejemplo usado en este post lo puedes encontrar en mi cuenta de GitHub.

Este post también lo puedes encontrar en mi blog.