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;"
답변
답변
몇 가지 옵션이 있습니다. 변수를 올바른 값으로 바꾸는 구성 파일을 처리하는 빌드 / 배포 단계로이를 수행 할 수 있습니다.
또 다른 옵션은이를 지원하는 자체 구성 섹션을 정의하는 것입니다. 예를 들어 다음 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);