Asp.NET Core, acceder a la configuración de forma tipada.

Una de las cosas que más me gustan del API de configuración de Asp.NET Core es su flexibilidad. Podemos incluir en la configuración ficheros en formato json o xml, variables de entorno, etc…

Pero una de las características que me gustan más es lo fácil que resulta mappear una sección de la configuración del archivo “appsettings.json” a una clase, y usar esta configuración de forma tipada mediante la inyección de dependencias nativa.

En este artículo vamos a ver como hacerlo. Tomaremos como ejemplo la configuración de un servidor Smtp.

"Smtp": {
  "SmtpServer": "localhost",
  "SmtpUser": "me",
  "SmtpPassword": "password",
  "SmtpPort": "25",
  "SmtpSSLPort": "587"
}

En primer lugar necesitamos una clase equivalente a la sección de la  configuración, lógicamente:

public class SmtpConfig
{
    public string SmtpServer { get; set; }
    public string SmtpUser { get; set; }
    public string SmptPassword { get; set; }
    public string SmtpPort { get; set; }
    public string SmtpSSLPort { get; set; }
}

En segundo lugar, registramos nuestra clase en el método “Configure” de la clase “Startup”, para enlazarla con la sección del archivo de configuración “SmtpConfig” y que el DI mapee los parametros de configuración con nuestra clase cuando vaya a crear una nueva instancia como veremos más adelante (preferiblemente lo más arriba posible.):

//! Add typed configuration for smtp.
services.Configure<SmtpConfig>(Configuration.GetSection("Smtp"));

Una vez hecho esto, podemos utilizar la configuración de forma tipada inyectando la clase en el constructor del controlador:

public class AccountController : Controller 
{
  private readonly IConfiguration _configuration;
  private readonly SmtpConfig _smtpConfig;
  //Ctor
  public AccountController(
      IConfiguration configuration,
      IOptions<SmtpConfig> smtpConfig,)
  {
      _configuration = configuration;
      _smtpConfig = smtpConfig.Value;
  }
}

Como se puede ver la DI de Asp.NET Core permite inyectar la clase mediante el interfaz “IOptions”, que inyecta un objeto generico “IOptions” de tipo “SmtpConfig”. La propiedad “Value” de este objeto nos permitirá finalmente acceder a las propiedades de nuestra clase:

...
//! Example using Mail.dll package.
using (var smtp = new Smtp())
{
    smtp.Connect(_smtpConfig.SmtpServer);
    smtp.UseBestLogin(_smtpConfig.SmtpUser, _smtpConfig.SmptPassword);
    .
    .
}
...

Y ya está, es sencillo, flexible y potente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *