3

複数の出力プロジェクト(Webサイト、管理ツール、およびSOAP APIレイヤー)を持つソリューションがあります。

それらはそれぞれ、ソリューション内の共通のプロジェクト(サービス層、データ層など)を共有します。これらの一般的なプロジェクトの1つで、構成レイヤーを保存しようとしています。

現在、出力プロジェクトごとに3つの個別のappsettings構成ファイルがあります-

  • development.AppSettings.config
  • testing.AppSettings.config
  • production.AppSettings.config

したがって、全部で9つの構成ファイルがあります。web.config appsettingsノードのconfigSource属性を利用して参照されるため、各プロジェクトで使用されるのは1つだけです。

とにかく、設定ファイルから値を追加/削除したいときはいつでも苦痛になります。これを行うには、 9つのファイルすべてを変更する必要があるためです。そして、これが私がやりたいことです:

一般的なプロジェクトでは、上記のように3つの構成ファイルがあります。これらは出力ディレクトリにコピーするように設定されるため、各プロジェクトにそれらのコピーがあります。これらは「ベース」構成になります。

次に、各プロジェクトで3つのファイルを再度作成したいのですが、必ずしも基本構成と同じ値が含まれている必要はありません。ただし、そうした場合、基本構成値は、出力プロジェクト構成の値によってオーバーライドされます。構成の継承の一形態だと思います。

アプリケーションの起動時に、これら2つの構成ファイル(基本構成ファイルとプロジェクト構成ファイル)を取得できるようにしたいと思います。次に、それに応じてアプリの設定を行います。

私が疑問に思っているのは、使用するファイルを決定するための良い方法は何ですか?また、これが大規模なソリューション間でアプリケーションの値を共有するための良い方法であるかどうか、そして別の、おそらくより効率的な方法があるかどうか疑問に思っています。

開発モードの場合、production.appsettings.configは必要ありません。また、本番モードの場合はその逆です。

出発して構成を取得する前に、現在のモード(開発/テスト/本番)を取得する簡単な方法はありますか?

4

3 に答える 3

1

1セットのファイル(3つの構成)を作成し、必要なプロジェクトでそれらをリンク/共有できます。

http://www.devx.com/vb2themax/Tip/18855

お役に立てれば。

于 2010-02-16T21:56:25.973 に答える
1

ConfigurationManager.OpenExeConfiguration静的メソッドを使用できます。これにより、必要な数の構成ファイルを操作できるようになります。

すべての設定を保存するカスタムクラスを作成してみることもできます。次に、オブジェクトをシリアル化してファイルとして保存できます。基本のカスタム構成クラスを拡張して、他のすべてのプロジェクトに適合させることができます。

于 2010-02-17T03:03:59.630 に答える
1

慎重に考え、03:30にトイレに行った後、私はうまくいく解決策に出くわしました。

基本構成ファイルにいくつかのappSettingsがあるとしましょう。

<add key="MyKey1" value="MyValue1" />
<add key="MyKey2" value="MyValue2" />
<!-- And so on... -->
<add key="MyKey5" value="MyValue5" />

そして、私の出力プロジェクトには、3つのappSettingsがあります。

<!-- This is used to identify which config to use. -->
<add key="Config" value="Development" />

<!-- Different value to the one in the base -->
<add key="MyKey2" value="NewValue2" />

<!-- This key does not exist in the base config -->
<add key="MyKey6" value="MyValue6" />

私のApplication_Startで、次の呼び出しがありますGetConfigs()

ConfigHelper.GetConfig(HostingEnvironment.MapPath( "〜/ bin / BaseConfig"));

そして実際のGetConfigs関数:

public static void GetConfigs()
{
  if (configMode == null)
  {
    configMode = ConfigurationManager.AppSettings.Get("Config").ToLowerInvariant();
  }

  //Now load the app settings file and retrieve all the config values.
  var config = XElement.Load(@"{0}\AppSettings.{1}.config".FormatWith(directory, configMode))
    .Elements("add")
    .Select(x => new { Key = x.Attribute("key").Value, Value = x.Attribute("value").Value })
    //If the current application instance does not contain this key in the config, then add it.
    //This way, we create a form of configuration inheritance.
    .Where(x => ConfigurationManager.AppSettings.Get(x.Key) == null);

  foreach (var configSetting in config)
  {
      ConfigurationManager.AppSettings.Set(configSetting.Key, configSetting.Value);
  }
}

これで、出力プロジェクトには事実上次の構成設定があります。

<add key="Config" value="Development" />
<add key="MyKey1" value="MyValue1" />
<add key="MyKey2" value="NewValue2" />
<!-- And so on... -->
<add key="MyKey5" value="MyValue5" />
<add key="MyKey6" value="MyValue6" />

シンプル!

于 2010-03-08T18:42:04.567 に答える