ASP.NET CORE

Configuración en ASP.NET Core

La configuración en ASP.NET Core es muy fácil de usar, y mucho más elegante que versiones anteriores de .NET Framework. Esta conformada por un conjunto de elementos externos que ASP.NET Core recibe, procesa y expone a la aplicación para su uso en tiempo de ejecución. Por lo general estos elementos externos u orígenes, son archivos de configuración de diferentes formatos (JSON, XML, INI, etc.), variables de entorno del sistema, argumentos de línea de comandos, secretos, etc. Estos pueden ser combinados o fusionados en una colección unificada de pares clave-valor.

Información
INFORMACIÓN

La principal ventaja de cualquier elemento de configuración, es que permite extraer del código cualquier elemento que pueda cambiar el comportamiento de la aplicación en tiempo de ejecución. ASP.NET Core permite realizar cambios a la configuración sin tener que volver a compilar o iniciar la aplicación, característica que no esta implementada en versiones anteriores de .NET Framework. Almacenar configuraciones fuera del código compilado es una buena práctica, ya que facilita modificarlos sin tener que volver a compilar el código.

En cuanto a la seguridad, es importante tener en cuenta que valores de configuración sensibles, como claves, tokens, contraseñas, etc. Deben estar fuera del código compilado, ya que podrían comprometerse con el control de fuente y ponerse a disposición del público. Incluso extraerse por medio de ingeniería inversa u otras técnicas parecidas, por eso, es mejor tener estos valores de forma externa, siempre que sea posible.

Modelo de Configuración de .NET Framework ↑

El modelo de configuración de la antigua versión .NET Framework de ASP.NET, expone el elemento <appsettings> en un archivo web.config, que permite almacenar pares de configuración clave-valor. La forma de obtener un valor de configuración en tiempo de ejecución es mediante la clase estática ConfigurationManager.

Modelo de Configuración de ASP.NET Core ↑

ASP.NET Core le brinda una experiencia de configuración totalmente renovada. En el nivel más básico, todavía se especifican los pares clave-valor como cadenas, pero en lugar de obtener esos valores desde un solo archivo, ahora se los puede cargar desde múltiples fuentes, mediante sus respectivos proveedores. Por ejemplo, puede obtener valores de configuración desde archivos en formato JSON, XML, INI, etc. desde variables de entorno del sistema, desde argumentos de línea de comandos, o por último, si ningún proveedor satisface sus necesidades, puede crear uno propio o personalizado, como por ejemplo, proveedores que accedan a la configuración desde una base de datos, desde un servicio remoto, etc.

El modelo de configuración de ASP.NET Core también tiene el concepto de invalidar o anular configuraciones dependiendo el orden en que han sido agregadas. El orden es sumamente importante, ya que puede sobrescribir los ajustes de un proveedor anterior.

El modelo de configuración de ASP.NET Core ha sido esencialmente el mismo desde .NET Core 1.0, sin embargo, en .NET 6, ASP.NET Core introdujo la clase ConfigurationManager. ConfigurationManager simplifica los patrones comunes para trabajar con la configuración implementando las dos interfaces principales relacionadas con la configuración:

A medida que se agregan los orígenes, se actualiza la vista actual de configuración.

ASP.NET Core utiliza la clase WebApplicationBuilder para iniciar la aplicación. Como parte de este proceso de arranque o construcción, WebApplicationBuilder expone la configuración de dos formas, cada una con diferente contexto:

El siguiente código C# de la clase Program.cs, muestra la propiedad Configuration en los dos contextos. Antes y después de la composición de la aplicación.

Program.cs
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

builder.Configuration.Sources...
builder.Configuration.AddJsonFile(...
builder.Configuration.AddIniFile(...
builder.Configuration.AddXmlFile(...
builder.Configuration.Bind(...
builder.Configuration.Get(...
builder.Configuration.GetChildren(...
builder.Configuration.GetSection(...

WebApplication app = builder.Build(); // Se construye o compone la aplicación.

app.Configuration.Bind(...
app.Configuration.Get(...
app.Configuration.GetChildren(...
app.Configuration.GetSection(...

app.MapGet("/", () => "Configuración en ASP.NET Core");
app.Run();

Proveedores ↑

ASP.NET Core utiliza proveedores de configuración para cargar pares clave-valor desde una variedad de orígenes o fuentes de datos, tales como:

El Administrador de Configuraciones o ConfigurationManager añade proveedores de configuración mediante la interfaz IConfigurationProvider. Los Proveedores de configuración describen como cargar los pares de clave-valor de una fuente en particular, como por ejemplo un archivo JSON, variables de entorno, etc.

Cuando ConfigurationManager agrega un proveedor de configuración, también agrega sus valores a la instancia de la interfaz IConfigurationRoot la cual implementa la interfaz IConfiguration, la misma que proporciona acceso al sistema de configuración ASP.NET Core, y es la única representación del modelo de configuración.

Acceso ↑

ASP.NET Core simplifica el acceso a la configuración básicamente de dos formas:

Validación ↑

ASP.NET Core permite validar los valores de configuración de clases de opciones u objetos fuertemente tipados de tres formas:

Configuración Posterior ↑

El proceso de configuración posterior de las opciones se ejecuta una vez realizada toda la configuración de IConfigureOptions, y puede resultar útil en escenarios en los que es necesario invalidar la configuración original.

Este proceso se puede realizar mediante dos métodos:

Proveedores Personalizados ↑

Hay muchos proveedores de configuración disponibles para orígenes de configuración comunes, como archivos JSON, XML e INI, variables de entorno, etc. Sin embargo, puede que requiera implementar un proveedor de configuración personalizado cuando uno de los proveedores disponibles no satisfaga las necesidades de su aplicación, como por ejemplo proveedores que accedan a la configuración desde una base de datos, desde un servicio remoto, etc.

Para crear un proveedor de configuración personalizado, debe primero crear una clase que represente el origen o la fuente, la cual debe implementar la interfaz IConfigurationSource. Debe también crear el proveedor, que es representado por una clase que hereda de ConfigurationProvider. Por último, debe crear un método de extensión que permita agregar el origen de configuración a la instancia subyacente de ConfigurationManager.

Inyección de Dependencias ↑

La configuración se puede insertar en los servicios mediante la Inyección de dependencias (DI) resolviendo el servicio IConfiguration:

Artículos Relacionados

Recursos Adicionales