[c#] app.config / web.config 내의 변수

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. (코드의 모든 연결을 관리 할 수 ​​있다는 것을 알고 있지만이 방식을 선호합니다).



답변

좋은 질문.

나는 없다고 생각합니다. 쉬운 방법이 있었다면 꽤 잘 알려졌을 것이라고 생각하며 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>


답변

약간 더 복잡하지만 훨씬 더 유연한 대안은 구성 섹션을 나타내는 클래스를 만드는 것입니다. 당신의에서 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 # 사용)에서 다음과 같은 두 개의 클래스를 만들 수 있습니다.

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"


답변

내 라이브러리 Expansive를 사용하여 수행 할 수 있습니다 . 여기 에서 nuget에서도 사용할 수 있습니다 .

이를 기본 사용 사례로 설계했습니다.

보통의 예 (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;"


답변

이 질문을 방금 본 것 같습니다.

요컨대, 애플리케이션 구성 내에 변수 보간이 없습니다.

두 가지 옵션이 있습니다

  1. 런타임에 변수를 대체하기 위해 직접 굴릴 수 있습니다.
  2. 빌드시 대상 배치 환경의 특정 특성에 맞게 애플리케이션 구성을 마사지하십시오. 구성 악몽처리 할 때 이에 대한 몇 가지 세부 사항


답변

몇 가지 옵션이 있습니다. 변수를 올바른 값으로 바꾸는 구성 파일을 처리하는 빌드 / 배포 단계로이를 수행 할 수 있습니다.

또 다른 옵션은이를 지원하는 자체 구성 섹션을 정의하는 것입니다. 예를 들어 다음 xml을 상상해보십시오.

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

이제 런타임에 변수 교체를 처리하는 사용자 지정 구성 개체를 사용하여이를 구현합니다.


답변

일반적으로 web.config의 각 설정에 액세스하는 속성이있는 정적 클래스를 작성합니다.

public static class ConfigManager
{
    public static string MyBaseDir
    {
        return ConfigurationManager.AppSettings["MyBaseDir"].toString();
    }

    public static string Dir1
    {
        return MyBaseDir + ConfigurationManager.AppSettings["Dir1"].toString();
    }

}

일반적으로이 클래스에서 필요할 때 유형 변환도 수행합니다. 구성에 대한 입력 된 액세스를 허용하며 설정이 변경되면 한 곳에서만 편집 할 수 있습니다.

일반적으로 설정을이 클래스로 바꾸는 것은 비교적 쉽고 유지 관리가 훨씬 쉽습니다.


답변

app.config설명하는 시나리오에 대해 환경 변수를 사용할 수 있습니다.

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

그러면 다음과 같이 쉽게 경로를 얻을 수 있습니다.

var pathFromConfig = ConfigurationManager.AppSettings["Dir1"];
var expandedPath = Environment.ExpandEnvironmentVariables(pathFromConfig);