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.
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:
IConfigurationBuilder
: Representa un tipo utilizado para crear la configuración de la aplicación. Permite añadir orígenes de configuración y compilar la versión final.IConfigurationRoot
: Representa la configuración final.
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:
WebApplicationBuilder.Configuration
:WebApplicationBuilder
crea una instancia deConfigurationManager
y la expone como propiedadConfiguration
.ConfigurationManager
permite configurar los proveedores, procesarlos, y obtener los valores de configuración. Una vez queIConfigurationBuilder.Build()
que se invoca, se compone la aplicación y se "inmoviliza" la configuración.WebApplication.Configuration
: permite obtener los valores de configuración. Devuelve un objeto ya configurado de tipoIConfiguration
, que representa un conjunto de propiedades de configuración de la aplicación en formato pares de clave-valor.
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.
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:
-
Archivos de Configuración: Con su clase base
FileConfigurationProvider
, que permite cargar la configuración del sistema de archivos en los siguientes formatos::JSON
: ProveedorJsonConfigurationProvider
.XML
: ProveedorXmlConfigurationProvider
.INI
: ProveedorIniConfigurationProvider
.
- Variables de Entorno: Mediante su proveedor
EnvironmentVariablesConfigurationProvider
, carga la configuración de los pares clave-valor desde variables de entorno declaradas en el sistema operativo. - Argumentos de Línea de Comandos: De forma predeterminada, el proveedor
CommandLineConfigurationProvider
reemplaza los valores de configuración establecidos por el resto de proveedores de configuración. - Archivos de Directorio: El proveedor
KeyPerFileConfigurationProvider
usa los archivos de un directorio como pares clave-valor de configuración. La clave es el nombre de archivo. El valor es el contenido del archivo. El proveedor de configuración de clave por archivo se usa en escenarios de hospedaje de Docker. - Configuración de Memoria: El proveedor
MemoryConfigurationProvider
usa una colección en memoria como pares clave-valor de configuración. - Proveedor de Configuración Personalizado:
ConfigurationProvider
permite crear un proveedor de configuración personalizado. - Otros Proveedores: Como
Azure Key Vault
,Azure App Configuration
, etc.
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:
- Abstracción
IConfiguration
:El acceso a la configuración se realiza mediante su respectiva clave, y la sintaxis de diccionariobuilder.Configuration["Clave"]
, que devuelven una cadena que posteriormente debe ser convertida al tipo requerido. Puede también hacer uso de los métodosGetValue<Type>
,GetSection
,GetChildren
yExists
. - Patrón de Opciones: ASP.NET Core promueve que todo acceso a la configuración se realice mediante la implementación del Patrón de Opciones, el cual utiliza clases para proporcionar acceso fuertemente tipado a grupos de configuraciones relacionadas. Este enfoque limpio permite evitar errores tipográficos y problemas de conversión, contrario al uso de la abstracción de la interfaz
IConfiguration
. Este modelo de configuración facilita agrupar configuraciones de manera lógica en torno a una característica determinada, y se presta bien para pruebas unitarias.
Validación
ASP.NET Core permite validar los valores de configuración de clases de opciones u objetos fuertemente tipados de tres formas:
- Atributos de anotacines de datos o
DataAnnotations
: Los validadores de anotaciones de datos permiten describir las reglas que se requieren aplicar a las propiedades de las clases de opciones u objetos fuertemente tipados, simplemente agregando uno o varios atributos, como por ejemploRequired
oStringLength
. - Delegados: Se pueden agregar una o más reglas de validación mediante el método
Validate
, el cual registra una acción de validación más complejapara un tipo de opciones. - Interfaz
IValidateOptions
: Permite implementar reglas de validación más complejas dentro de una clase.
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:
PostConfigure
: Permite configurar posteriormente las opciones con nombre.PostConfigureAll
: Permite configurar posteriormente todas las instancias de configuración.
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
- Configuración en ASP.NET Core Mediante Archivos JSON.
- Configuración en ASP.NET Core Mediante Archivos INI.
- Configuración en ASP.NET Core Mediante Archivos XML.
- Configuración en ASP.NET Core Mediante Argumentos de Línea de Comandos.
- Recarga de Archivos de Configuración en ASP.NET Core.
- Acceso a la Configuración de ASP.NET Core Mediante IConfiguration.
- Acceso a la Configuración de ASP.NET Core Mediante el Patrón de Opciones.
- Validación de la Configuración en ASP.NET Core Mediante el Patrón de Opciones.
- Configuración Posterior en ASP.NET Core Mediante el Patrón de Opciones.
Recursos Adicionales
- Configuración en ASP.NET Core.
- Configuración en .NET.
- Proveedores de configuración en .NET.
- Clase ConfigurationManager.
- Código Fuente de la Clase ConfigurationManager..
- Código Fuente de la Interfaz IConfigurationManager..
- Interfaz IConfigurationRoot.
- Código Fuente de la Interfaz IConfigurationRoot..
- Interfaz IConfigurationBuilder.
- Código Fuente de la Interfaz IConfigurationBuilder..
- Interfaz IConfiguration.
- Código Fuente de la Interfaz IConfiguration..
- Interface IConfigurationSource.
- Código Fuente de la Interfaz IConfigurationSource..
- Interface IConfigurationProvider.
- Código Fuente de la Interfaz IConfigurationProvider..
- Clase WebApplicationBuilder.
- Clase WebApplication.