22

ConfigurationManager.AppSettings["mysettingkey"]を使用して現在設定を取得しているアプリを取得して、app.configファイルではなく中央データベースから実際に設定を取得できるようにしたいと考えています。このようなことを処理するためのカスタム構成セクションを作成できますが、私のチームの他の開発者が新しい DbConfiguration カスタム セクションを使用するためにコードを変更する必要はありません。いつものように AppSettings を呼び出せるようにしたいのですが、中央データベースからロードできるようにしたいだけです。

何か案は?

4

6 に答える 6

25

フレームワークをハッキングしてもかまわず、アプリケーションが実行されている .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!");
  }
}
于 2008-10-02T00:04:25.643 に答える
1

何をするにしても、リダイレクトのレイヤーを 1 つ追加する必要がありますか? ConfigurationManager.AppSettings["key"] は常に構成ファイルを参照します。ConfigurationFromDatabaseManager を作成できますが、これは異なる呼び出し構文を使用することになります。

ConfigurationFromDatabaseManager.AppSettings["key"] instead of ConfigurationSettings["key"].
于 2008-10-01T20:28:00.843 に答える
0

アプリケーションスターターを作成し、データベースからアプリケーションドメインに設定をロードしようとしました。そのため、アプリは構成がどのように生成されるかについて何も知りません。machiene.config を使用すると、dll-hell 2.0 に直接つながります。

于 2009-08-12T12:34:05.770 に答える
0

オーバーライドできるかどうかはわかりませんが、AppSettings の Add メソッドを試して、アプリケーションの起動時に DB 設定を追加できます。

于 2008-10-01T17:41:55.237 に答える
0

変更した構成ファイルをディスクに保存できる場合は、別のアプリケーション ドメインに別の構成ファイルを読み込むことができます。

AppDomain.CreateDomain("second", null, new AppDomainSetup
{
    ConfigurationFile = options.ConfigPath,
}).DoCallBack(...);
于 2017-02-22T15:28:59.437 に答える
-1

machine.config の appSettings 定義セクションで allowOverride 属性を設定することにより、.NET 3.5 でこれを行う方法があるようです。これにより、独自の app.config ファイルのセクション全体をオーバーライドし、それを処理する新しいタイプを指定できます。

于 2008-10-02T00:01:20.393 に答える