read net from example configurationsettings app .net configuration app-config

.net - net - ¿Hay alguna manera de anular ConfigurationManager.AppSettings?



configurationsettings.appsettings c# (6)

Realmente quiero poder tener una manera de tomar una aplicación que actualmente obtiene su configuración usando ConfigurationManager.AppSettings ["mysettingkey"] para que realmente esos ajustes provengan de una base de datos centralizada en lugar del archivo app.config. Puedo hacer una sección de configuración personalizada para manejar este tipo de cosas, pero realmente no quiero que otros desarrolladores en mi equipo tengan que cambiar su código para usar mi nueva sección personalizada de DbConfiguration. Solo quiero que puedan llamar a AppSettings como lo han hecho siempre, pero que se carguen desde una base de datos central.

¿Algunas ideas?


¿Hagas lo que hagas necesitarás agregar una capa de redirección? ConfigurationManager.AppSettings ["key"] siempre buscará en el archivo de configuración. Puede hacer un ConfigurationFromDatabaseManager pero esto dará como resultado el uso de diferentes sintaxis de llamadas:

ConfigurationFromDatabaseManager.AppSettings["key"] instead of ConfigurationSettings["key"].


No estoy seguro de que pueda anularlo, pero puede probar el método Agregar de AppSettings para agregar su configuración de base de datos cuando se inicien las aplicaciones.


Parece que hay una forma de hacerlo en .NET 3.5 estableciendo el atributo allowOverride en la sección de definición de appSettings de machine.config. Esto le permite anular toda la sección en su propio archivo app.config y especificar un nuevo tipo para manejarlo.


Si no te importa piratear el framework y puedes asumir razonablemente que la versión de .net framework en la que se ejecuta la aplicación (es decir, es una aplicación web o una aplicación de intranet), entonces podrías intentar algo como esto:

using System; using System.Collections.Specialized; using System.Configuration; using System.Configuration.Internal; using System.Reflection; static class ConfigOverrideTest { sealed class ConfigProxy:IInternalConfigSystem { readonly IInternalConfigSystem baseconf; public ConfigProxy(IInternalConfigSystem baseconf) { this.baseconf = baseconf; } object appsettings; public object GetSection(string configKey) { if(configKey == "appSettings" && this.appsettings != null) return this.appsettings; object o = baseconf.GetSection(configKey); if(configKey == "appSettings" && o is NameValueCollection) { // create a new collection because the underlying collection is read-only var cfg = new NameValueCollection((NameValueCollection)o); // add or replace your settings cfg["test"] = "Hello world"; o = this.appsettings = cfg; } return o; } public void RefreshConfig(string sectionName) { if(sectionName == "appSettings") appsettings = null; baseconf.RefreshConfig(sectionName); } public bool SupportsUserConfig { get { return baseconf.SupportsUserConfig; } } } static void Main() { // initialize the ConfigurationManager object o = ConfigurationManager.AppSettings; // hack your proxy IInternalConfigSystem into the ConfigurationManager FieldInfo s_configSystem = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.Static | BindingFlags.NonPublic); s_configSystem.SetValue(null, new ConfigProxy((IInternalConfigSystem)s_configSystem.GetValue(null))); // test it Console.WriteLine(ConfigurationManager.AppSettings["test"] == "Hello world" ? "Success!" : "Failure!"); } }


Intentaría escribir un inicio de aplicación y cargar la configuración de la base de datos al dominio de la aplicación. Entonces la aplicación no sabe nada sobre cómo se genera su configuración. Usar machiene.config conduce directamente a dll-hell 2.0.


Si puede guardar su archivo de configuración modificado en el disco, puede cargar el archivo de configuración alternativo en diferentes dominios de aplicación:

AppDomain.CreateDomain("second", null, new AppDomainSetup { ConfigurationFile = options.ConfigPath, }).DoCallBack(...);