.NET Core: Cómo usar App Settings en una aplicación de consola

Una de las premisas de .NET Core es usar los archivos de configuración de las aplicaciones basados en json, en lugar de XML.

Es así como el app.config o web.config desaparecen, así como las tradicionales clases para leerlos.

Hoy en día .NET Core permite crear aplicaciones web y aplicaciones de consola. En ambos casos, el archivo de configuración es el que nosotros definamos (en general le llamaremos appsettings.json).

Para usar este mecanismo de lectura de settings de la aplicación en la web el mecanismo es bastante conocido desde la clase Startup.cs; pero para las aplicaciones de consola hay que personalizar algunas cosillas.

Lo primero que debemos hacer, es agregar el archivo de configuración per se, pues éste no se incluye por defecto en el template de aplicación de consola de .NET Core.

En Visual Studio 2015 no hay forma directa de hacer esto, dado que cuando escogemos add new item, no aparece por ejemplo: "json file".

Sin embargo encontré esta buena extensión:

image

Que nos permite agregar muy fácilmente cualquier tipo de archivo a nuestra solución.

Así pues, en el root de nuestra aplicación de consola agregamos por ejemplo el archivo appsettings.json.

El template de json se carga por defecto y sencillamente agregamos los settings que requiramos. Por ejemplo:

 {
  "setting1": "value1",
  "setting2": 2,
  "setting3": 3.00
}

Una vez tenemos el archivo, solo basta con configurar nuestro proyecto para que sepa que lo vamos a usar.

Primero le indicamos al sistema que incluya el archivo de settings en el output. Esto se hace dentro de la sección de "buildOptions". Agregando la entrada de "copyToOutput":

 "buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
      "includeFiles": ["appsettings.json"]
    }
  },

Adicionalmente agregamos la siguiente dependencia:

 "Microsoft.Extensions.Configuration.Json": "1.1.0"

que nos incluye el assembly requerido para cargar la configuración.

Como ya ha de ser costumbre, salva el archivo para que Visual Studio en virtud de la nueva dependencia agregada traiga de la red o del caché del equipo los assemblies requeridos y los incluya en la solución.

Finalmente, escribimos el código para poder acceder a los settings. Como buena práctica recomiendo crear una clase estática llamada ConfigHelper.cs o algo por el estilo:

El método retorna un objeto de la familia IConfiguration. Al final, basta con consultar la variable requerida a manera de índice:

 public static class ConfigHelper
    {
        public static IConfiguration Config
        {
            get
            {
                var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
                return builder.Build();
            }
        }
    }

Y aquí ya comenzar a usar el valor del setting, de acuerdo a lo que necesites:

 using System;
using static NetCoreConsoleSettings.ConfigHelper;
 
namespace NetCoreConsoleSettings
{
    public class Program
    {   public static void Main(string[] args)
        {
            Console.WriteLine($"The value for setting1 is {Config["setting1"]} and for setting2 is {Config["setting2"]}");
            Console.ReadLine();
        }
    }
}

Nótese que aquí usamos la característica de C# 6.0 a través de la cual hacemos el using de una clase estática para poder acceder directamente a sus miembros y propiedades; por ejemplo a Config[“nombreSetting”].

 

Sigue el código completo de este ejemplo en GitHub:

Image result for github png logo