当前位置:  开发笔记 > 编程语言 > 正文

有没有办法覆盖ConfigurationManager.AppSettings?

如何解决《有没有办法覆盖ConfigurationManager.AppSettings?》经验,为你挑选了1个好方法。

我真的希望有一种方法可以使用ConfigurationManager.AppSettings ["mysettingkey"]获取当前获取其设置的应用程序,实际上这些设置来自集中式数据库而不是app.config文件.我可以创建一个自定义配置部分来处理这类事情,但我真的不希望团队中的其他开发人员必须更改他们的代码以使用我的新DbConfiguration自定义部分.我只是希望他们能够以他们一直以来的方式调用AppSettings,但是可以从中央数据库加载它.

有任何想法吗?



1> Pent Ploompu..:

如果你不介意破解框架,你可以合理地假设应用程序运行的.net框架版本(即它是一个Web应用程序或内部网应用程序),那么你可以尝试这样的事情:

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!");
  }
}


私人反思......非常顽皮.
`s_configSystem`私有字段是`ConfigurationManager`的实现细节,它可能在将来的框架版本中发生变化,或者根本不存在(例如mono有一个名为[configSystem]的字段(https://github.com/mono) /mono/blob/effa4c07ba850bedbe1ff54b2a5df281c058ebcb/mcs/class/System.Configuration/System.Configuration/ConfigurationManager.cs#L48)而不是).
推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有