Patrón de Opciones
[Arquitectura
]
¿Quien no recuerda los maravillosos Configuration Provider que nos hemos montado más de una vez para albergar en una clase todas las settings de nuestra aplicación y no tener desparramado por el código el acceso a estas (de esta forma, si cambiaba una setting se centralizaba en un punto y se replicaba en todo el contexto de la aplicación)?
¿Qué no sabes de lo que te hablo?:
public static class ConfigProvider {
public string Usuario = ConfigurationManager.AppSettings["User"];
public string Password = ConfigurationManager.AppSettings["Password"];
public int Reintentos = 3;
public bool IsLoginActive = true;
etc.
etc.
etc.
}
public static class Main {
var config = new ConfigProvider();
Console.WriteLine(config.Usuario);
}
Sin embargo, con Net Core, se lo han currado un poco más y ahora queda centralizado a la hora de registrar las dependencias.
Primero de todo generamos una clase para la sección de las appsettings o para todo el appsettings, recordemos que, si hacemos esta última, será accesible desde cualquier punto de la aplicación.
Appsettings.json { “MySettings”: { “StringSetting”: “My Value”, “IntSetting”: 23 } }
public class MySettings
{
public string StringSetting { get; set; }
public int IntSetting { get; set; }
}
Por otro lado, registramos en el contenedor de servicios la clase que hemos definido anteriormente, aquí esta la magia:
services.Configure<MySettings>(
options => Configuration.GetSection("MySettings")
.Bind(options));
En este punto al levantar la aplicación ésta gestiona el contenedor de dependencias y lee el archivo appsettings registrando una instancia de la clase MySettings.
Y ya.
A partir de aquí en las clases que necesitemos acceder a la configuración simplemente inyectaremos una interfaz IOptions
public class HomeController : Controller
{
private MySettings _settings;
public HomeController(IOptions<MySettings> settings)
{
_settings = settings.Value
// _settings.StringSetting == "My Value";
}
}
Lo mejor de todo es que podemos inyectar esta configuración en páginas Razor:
@page
@model IndexModel
@using Microsoft.Extensions.Options
@inject IOptionsMonitor<MySettings> _settings
@{
ViewData["StringSetting"] = _settings.StringSetting;
}
<h1>@ViewData["StringSetting"]</h1>
Saludos.