是否可以在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
中更改一个条目。
(我知道我可以管理代码中的所有连接,但我更喜欢这种方式。)
答案 0 :(得分:22)
稍微复杂但更灵活的替代方法是创建一个表示配置节的类。在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"
答案 1 :(得分:14)
您可以使用我的扩展库来完成:http://nuget.org/List/Packages/Expansive 来源可在此处获取:https://github.com/anderly/Expansive
答案 2 :(得分: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>
答案 3 :(得分:4)
我以为我刚看到这个问题。
简而言之,不,应用程序配置中没有变量插值。
您有两个选择
答案 4 :(得分:3)
你有几个选择。您可以使用构建/部署步骤执行此操作,该步骤将处理您的配置文件,使用正确的值替换您的变量。
另一种选择是定义支持此功能的配置部分。例如想象一下这个xml:
<variableAppSettings>
<variables>
<add key="@BaseDir" value="c:\Programs\Widget"/>
</variables>
<appSettings>
<add key="PathToDir" value="@BaseDir\Dir1"/>
</appSettings>
</variableAppSettings>
现在,您将使用自定义配置对象来实现此功能,这些对象将在运行时为您替换变量。
答案 5 :(得分:3)
通常,我最终编写了一个带有属性的静态类来访问我的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();
}
}
通常,我也会在此课程中需要时进行类型转换。它允许对您的配置进行类型化访问,如果设置发生变化,您只能在一个地方进行编辑。
通常,使用此类替换设置相对容易,并提供更高的可维护性。
答案 6 :(得分:2)
您可以在app.config
中为您描述的方案使用环境变量
<configuration>
<appSettings>
<add key="Dir1" value="%MyBaseDir%\Dir1"/>
</appSettings>
</configuration>
然后您可以轻松地获得路径:
var pathFromConfig = ConfigurationManager.AppSettings["Dir1"];
var expandedPath = Environment.ExpandEnvironmentVariables(pathFromConfig);
答案 7 :(得分:1)
在<appSettings>
内,您可以创建应用程序密钥
<add key="KeyName" value="Keyvalue"/>
稍后您可以使用以下方式访问这些值:
ConfigurationManager.AppSettings["Keyname"]
答案 8 :(得分: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")
答案 9 :(得分:0)
我认为你不能声明和使用变量来定义配置文件中的appSettings键。我总是在像你这样的代码中管理连接。
答案 10 :(得分:0)
我正在努力解决你想要的问题,但你可以在应用程序设置中添加覆盖文件,然后在每个环境的基础上设置覆盖文件。
<appSettings file="..\OverrideSettings.config">
答案 11 :(得分:0)
对于我们需要配置大量具有相似值的项目的产品,我们使用小型控制台应用程序来读取XML并根据传入的参数进行更新。然后安装程序在询问后调用这些应用程序。用户提供所需信息。
答案 12 :(得分: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>
答案 13 :(得分:0)
我提出了这个解决方案:
我对这个解决方案并不满意,因为我必须手动更改所有属性,如果我添加一个新的属性,我必须在app.xaml.cs中考虑它。
这是App.xaml.cs的代码片段:
string configBase = Settings.Default.ConfigurationBase;
Settings.Default.CommonOutput_Directory = Settings.Default.CommonOutput_Directory.Replace("${ConfigurationBase}", configBase);
<强>更新强>
刚刚找到了改进(同样是app.xaml.cs的代码片段):
string configBase = Settings.Default.ConfigurationBase;
foreach (SettingsProperty settingsProperty in Settings.Default.Properties)
{
if (!settingsProperty.IsReadOnly && settings.Default[settingsProperty.Name] is string)
{
Settings.Default[settingsProperty.Name] = ((string)Settings.Default[settingsProperty.Name]).Replace("${ConfigurationBase}", configBase);
}
}
现在,替换适用于我的设置中具有Type = string和Scope = User的所有属性。我想我喜欢这样。
<强> UPDATE2 强>
在属性上运行时,显然不需要设置Scope = Application。
答案 14 :(得分:0)
我知道我迟到了,我一直在寻找是否有任何关于变量配置设置问题的新解决方案。有一些答案触及我过去使用的解决方案,但大多数似乎有点复杂。我以为我会查看我的旧解决方案并将实现放在一起,以便它可以帮助那些正在努力解决同样问题的人。
对于此示例,我在控制台应用程序中使用了以下应用程序设置:
<appSettings>
<add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
<add key="StaticClassExample" value="bin"/>
<add key="InterpollationExample" value="{0}bin"/>
</appSettings>
我相信autocro autocro's answer触及了它。我只是做一个实现,在构建或调试时就足够了,而不必关闭visual studio。我在当天使用过这个解决方案......
警告:使用一个不易被替换的变量,因此请使用您的项目名称或类似的变量名称。
SETX BaseDir "$(ProjectDir)"
private void Test_Environment_Variables()
{
string BaseDir = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
string ExpandedPath = Environment.ExpandEnvironmentVariables(BaseDir).Replace("\"", ""); //The function addes a " at the end of the variable
Console.WriteLine($"From within the C# Console Application {ExpandedPath}");
}
`
private void Test_Interpollation()
{
string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
Console.WriteLine($"Using old interpollation {ExpandedPath}");
}
`
`
private void Test_Static_Class()
{
Console.WriteLine($"Using a static config class {Configuration.BinPath}");
}
`
`
static class Configuration
{
public static string BinPath
{
get
{
string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
return SolutionPath + ConfigPath;
}
}
}
`
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<appSettings>
<add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
<add key="StaticClassExample" value="bin"/>
<add key="InterpollationExample" value="{0}bin"/>
</appSettings>
</configuration>
using System;
using System.Configuration;
using System.IO;
namespace ConfigInterpollation
{
class Program
{
static void Main(string[] args)
{
new Console_Tests().Run_Tests();
Console.WriteLine("Press enter to exit");
Console.ReadLine();
}
}
internal class Console_Tests
{
public void Run_Tests()
{
Test_Environment_Variables();
Test_Interpollation();
Test_Static_Class();
}
private void Test_Environment_Variables()
{
string ConfigPath = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
string ExpandedPath = Environment.ExpandEnvironmentVariables(ConfigPath).Replace("\"", "");
Console.WriteLine($"Using environment variables {ExpandedPath}");
}
private void Test_Interpollation()
{
string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
Console.WriteLine($"Using interpollation {ExpandedPath}");
}
private void Test_Static_Class()
{
Console.WriteLine($"Using a static config class {Configuration.BinPath}");
}
}
static class Configuration
{
public static string BinPath
{
get
{
string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
return SolutionPath + ConfigPath;
}
}
}
}