95

app.configまたはweb.configファイルで次のようなことを行うことは可能ですか?

<appSettings>
 <add key="MyBaseDir" value="C:\MyBase" />
 <add key="Dir1" value="[MyBaseDir]\Dir1"/>
 <add key="Dir2" value="[MyBaseDir]\Dir2"/>
</appSettings>

次に、次のように単純に言って、コードで Dir2 にアクセスします。

 ConfigurationManager.AppSettings["Dir2"]

これは、アプリケーションをさまざまなサーバーや場所にインストールするときに役立ちますapp.config。(すべての連結をコードで管理できることはわかっていますが、私はこの方法を好みます)。

4

15 に答える 15

23

もう少し複雑ですが、はるかに柔軟な代替手段は、構成セクションを表すクラスを作成することです。app.config/web.configファイルには、次のように記述できます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- This section must be the first section within the <configuration> node -->
    <configSections>
        <section name="DirectoryInfo" type="MyProjectNamespace.DirectoryInfoConfigSection, MyProjectAssemblyName" />
    </configSections>

    <DirectoryInfo>
        <Directory MyBaseDir="C:\MyBase" Dir1="Dir1" Dir2="Dir2" />
    </DirectoryInfo>
</configuration>

次に、.NET コード (この例では C# を使用します) で、次のような 2 つのクラスを作成できます。

using System;
using System.Configuration;

namespace MyProjectNamespace {

    public class DirectoryInfoConfigSection : ConfigurationSection {

        [ConfigurationProperty("Directory")]
        public DirectoryConfigElement Directory {
            get {
                return (DirectoryConfigElement)base["Directory"];
            }
    }

    public class DirectoryConfigElement : ConfigurationElement {

        [ConfigurationProperty("MyBaseDir")]
        public String BaseDirectory {
            get {
                return (String)base["MyBaseDir"];
            }
        }

        [ConfigurationProperty("Dir1")]
        public String Directory1 {
            get {
                return (String)base["Dir1"];
            }
        }

        [ConfigurationProperty("Dir2")]
        public String Directory2 {
            get {
                return (String)base["Dir2"];
            }
        }
        // You can make custom properties to combine your directory names.
        public String Directory1Resolved {
            get {
                return System.IO.Path.Combine(BaseDirectory, Directory1);
            }
        }
    }
}

app.config最後に、プログラム コードで、次のように新しいクラスを使用して変数にアクセスできます。

DirectoryInfoConfigSection config =
  (DirectoryInfoConfigSection)ConfigurationManager.GetSection("DirectoryInfo");
String dir1Path = config.Directory.Directory1Resolved;  // This value will equal "C:\MyBase\Dir1"
于 2009-03-02T17:25:09.587 に答える
18

私のライブラリExpansiveを使用して達成できます。こちらのナゲットでも入手できます。

これを主なユースケースとして設計されました。

中程度の例 (AppSettings をトークン拡張のデフォルト ソースとして使用)

app.config で:

<configuration>
    <appSettings>
        <add key="Domain" value="mycompany.com"/>
        <add key="ServerName" value="db01.{Domain}"/>
    </appSettings>
    <connectionStrings>
        <add name="Default" connectionString="server={ServerName};uid=uid;pwd=pwd;Initial Catalog=master;" provider="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

展開する文字列に対して.Expand()拡張メソッドを使用します。

var connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
connectionString.Expand() // returns "server=db01.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

また

Dynamic ConfigurationManager ラッパー「Config」を次のように使用します (Expand() への明示的な呼び出しは必要ありません)。

var serverName = Config.AppSettings.ServerName;
// returns "db01.mycompany.com"

var connectionString = Config.ConnectionStrings.Default;
// returns "server=db01.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

高度な例 1 (トークン拡張のデフォルト ソースとして AppSettings を使用)

app.config で:

<configuration>
    <appSettings>
        <add key="Environment" value="dev"/>
        <add key="Domain" value="mycompany.com"/>
        <add key="UserId" value="uid"/>
        <add key="Password" value="pwd"/>
        <add key="ServerName" value="db01-{Environment}.{Domain}"/>
        <add key="ReportPath" value="\\{ServerName}\SomeFileShare"/>
    </appSettings>
    <connectionStrings>
        <add name="Default" connectionString="server={ServerName};uid={UserId};pwd={Password};Initial Catalog=master;" provider="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

展開する文字列に対して .Expand() 拡張メソッドを使用します。

var connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
connectionString.Expand() // returns "server=db01-dev.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"
于 2011-10-10T23:07:50.467 に答える
7

良い質問。

ないと思います。簡単な方法があれば、非常によく知られていると思います。Microsoft は、展開とテスト用にさまざまな構成ファイルを展開するためのメカニズムを Visual Studio 2010 で作成しているようです。

そうは言っても、しかし; ConnectionStringsセクションに「|DataDirectory|」という一種のプレースホルダーがあることがわかりました。たぶん、あなたはそこで働いているものを見ることができます...

これはそれを示す一部machine.configです:

 <connectionStrings>
    <add
        name="LocalSqlServer"
        connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
        providerName="System.Data.SqlClient"
    />
 </connectionStrings>
于 2009-03-02T17:12:11.413 に答える
4

私はちょうどこの質問を見たと思いました。

要するに、いいえ、アプリケーション構成内に変数補間はありません。

2 つのオプションがあります

  1. 独自にロールして、実行時に変数を置き換えることができます
  2. ビルド時に、アプリケーションの構成を対象の展開環境の特定の仕様に合わせます。構成の悪夢に対処する際のこれに関するいくつかの詳細
于 2009-03-02T16:51:48.513 に答える
3

app.config説明するそのシナリオでは、環境変数を使用できます

<configuration>
  <appSettings>
    <add key="Dir1" value="%MyBaseDir%\Dir1"/>
  </appSettings>
</configuration>

次に、次の方法で簡単にパスを取得できます。

var pathFromConfig = ConfigurationManager.AppSettings["Dir1"];
var expandedPath = Environment.ExpandEnvironmentVariables(pathFromConfig);
于 2015-11-24T21:38:33.450 に答える
3

いくつかのオプションがあります。これは、構成ファイルを処理して変数を正しい値に置き換えるビルド/デプロイ手順で行うことができます。

別のオプションは、これをサポートする独自の構成セクションを定義することです。たとえば、次の xml を想像してください。

<variableAppSettings>
 <variables>
    <add key="@BaseDir" value="c:\Programs\Widget"/>
 </variables>
 <appSettings>
    <add key="PathToDir" value="@BaseDir\Dir1"/>
 </appSettings>
</variableAppSettings>

ここで、実行時に変数の置換を処理するカスタム構成オブジェクトを使用してこれを実装します。

于 2009-03-02T16:47:24.887 に答える
2

内部<appSettings>でアプリケーションキーを作成できます。

<add key="KeyName" value="Keyvalue"/>

後で、次を使用してこれらの値にアクセスできます。

ConfigurationManager.AppSettings["Keyname"]
于 2009-03-02T16:27:07.730 に答える
1

DslConfigをお勧めします。DslConfig を使用すると、Global Config、サーバー ホストごとの構成から各サーバー ホストのアプリケーションごとの構成まで、階層構成ファイルを使用できます (AppSpike を参照)。
これが複雑すぎる場合は、グローバル構成の Variables.var を使用でき
ます。Varibales.var で構成するだけです。

baseDir = "C:\MyBase"
Var["MyBaseDir"] = baseDir
Var["Dir1"] = baseDir + "\Dir1"
Var["Dir2"] = baseDir + "\Dir2"

そして、設定値を取得します

Configuration config = new DslConfig.BooDslConfiguration()
config.GetVariable<string>("MyBaseDir")
config.GetVariable<string>("Dir1")
config.GetVariable<string>("Dir2")
于 2012-02-10T17:47:39.153 に答える
0

Matt Hamsmith のソリューションに従うことをお勧めします。実装することが問題である場合は、AppSettings クラスのバックグラウンドでこれを実装する拡張メソッドを作成してみませんか?

何かのようなもの:

    public static string GetValue(this NameValueCollection settings, string key)
    {

    }

メソッド内で、Linq を使用して DictionaryInfoConfigSection を検索し、一致するキーを持つ値を返します。ただし、次の行に沿って構成ファイルを更新する必要があります。

<appSettings>
  <DirectoryMappings>
    <DirectoryMap key="MyBaseDir" value="C:\MyBase" />
    <DirectoryMap key="Dir1" value="[MyBaseDir]\Dir1"/>
    <DirectoryMap key="Dir2" value="[MyBaseDir]\Dir2"/>
  </DirectoryMappings>
</appSettings>
于 2009-11-03T10:12:19.570 に答える
0

同様の値で多くの項目を構成する必要がある製品をロールアウトするために、XML を読み取り、渡されたパラメーターに基づいて更新する小さなコンソール アプリを使用します。必要な情報。

于 2009-03-02T17:00:27.243 に答える
0

構成ファイル内で appSettings キーを定義するために変数を宣言して使用することはできないと思います。私はいつもあなたのようなコードで連結を管理してきました。

于 2009-03-02T16:39:05.143 に答える
0

私はあなたが望むものに少し苦労していますが、上書きファイルをアプリ設定に追加して、その上書きファイルを環境ごとに設定することができます。

<appSettings file="..\OverrideSettings.config">
于 2009-03-02T16:39:57.900 に答える