Cambiar en caliente la configuración fuertemente tipada en ASP.NET Core 2 (III)
Desde el punto de vista práctico del desarrollo, y más pensando en desarrollos grandes o donde entren en juego varias personas, es a veces tedioso tener en cuenta si una configuración debe ser refrescada en caliente o no, o no olvidarnos de marcar la interfaz IOptionsSnapshot en los constructores de cada controlador.
Para este propósito, podemos hacer más liviano al controlador, haciendo general el uso de IOptions o IOptionsSnapshot y no correr el riesgo de que se nos pase hacer esto en el controlador.
Siguiendo con el ejemplo en el que hemos trabajado en las últimas entregas que tratan sobre el cambio y aplicación de la configuración en caliente de ASP.NET Core, vamos a aplicar dos cambios, uno en la clase Startup, y otro cambio en el controlador que hemos utilizado para demostrar el funcionamiento de la configuración fuertemente tipada.
En el caso de la clase Startup, y en concreto dentro del método ConfigureServices, vamos a añadir el alcance de la configuración cargada, indicando que sean de tipo IOptionsSnapshot.
Nuestro método ConfigureServices quedará por lo tanto de la siguiente forma:
public void ConfigureServices(IServiceCollection services) { services.Configure<CustomSettings>(Configuration.GetSection("Custom")); services.Configure<ContactSettings>(Configuration.GetSection("Contact")); services.AddScoped(settings => settings.GetService<IOptionsSnapshot<CustomSettings>>().Value); services.AddScoped(settings => settings.GetService<IOptionsSnapshot<ContactSettings>>().Value); services.AddMvc(); }
Finalmente, modificaremos el código del constructor de nuestro controlador.
public HomeController(ContactSettings contactSettings, CustomSettings customSettings) { _contactSettings = contactSettings; _customSettings = customSettings; }
Si ejecutamos nuevamente nuestra aplicación ASP.NET Core MVC y cambiamos en este caso, cualquiera de los dos archivos de configuración, veremos que los cambios son obtenidos en caliente también.
Lo mejor aquí, es que en la clase Startup hemos indicado nuestros propósitos, y en el constructor de cada controlador, sólo nos tenemos que preocupar de obtener las clases con los valores precargados para utilizarlos.
¡Happy Coding!