您更喜欢这些或其他方法中的哪一种(如果有的话)?为什么呢?
答案 0 :(得分:21)
当键值对不够时,我使用配置节,因为它们使用起来并不复杂(除非你需要一个复杂的部分):
定义自定义栏目:
public class CustomSection : ConfigurationSection
{
[ConfigurationProperty("LastName", IsRequired = true,
DefaultValue = "TEST")]
public String LastName
{
get { return (String)base["LastName"]; }
set { base["LastName"] = value; }
}
[ConfigurationProperty("FirstName", IsRequired = true, DefaultValue =
"TEST")]
public String FirstName
{
get { return (String)base["FirstName"]; }
set { base["FirstName"] = value; }
}
public CustomSection()
{
}
}
以编程方式创建您的部分(如果它尚不存在):
// Create a custom section.
static void CreateSection()
{
try
{
CustomSection customSection;
// Get the current configuration file.
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(@"ConfigurationTest.exe");
// Create the section entry
// in the <configSections> and the
// related target section in <configuration>.
if (config.Sections["CustomSection"] == null)
{
customSection = new CustomSection();
config.Sections.Add("CustomSection", customSection);
customSection.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Full);
}
}
catch (ConfigurationErrorsException err)
{
//manage exception - give feedback or whatever
}
}
在CustomSection定义之后,将为您创建实际的CustomSection:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="CustomSection" type="ConfigurationTest.CustomSection, ConfigurationTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="true" />
</configSections>
<CustomSection LastName="TEST" FirstName="TEST" />
</configuration>
现在检索您的部分属性:
CustomSection section = (CustomSection)ConfigurationManager.GetSection("CustomSection");
string lastName = section.LastName;
string firstName = section.FirstName;
答案 1 :(得分:12)
如果我可以使用它,我将使用App.Config,但是,如果我需要更复杂的东西,我将使用自定义配置部分。是的,在开始时理解它是一件痛苦的事情,但是我认为统一配置源和所有设置的熟悉配置值得花时间投资。
答案 2 :(得分:4)
将您的配置放入数据库。如果您在多台计算机上运行您的应用程序(例如客户端 - 服务器应用程序),则所有每台计算机配置系统都是PITA。单个配置区域是放置配置的最佳方式。写一个gui来管理它,你会非常高兴。
将app.config文件分发到200个客户端盒子......它不好玩,特别是当一个人错过时(他们确实相信我)。
答案 3 :(得分:2)
我过去曾是网络/系统管理员,现在我为数据库应用程序开发内部实用程序。我发现的是:
简单的非嵌套配置文件最适合那些不会在他们非常访问资源的位置发生变化的应用程序。
任何更复杂的东西都需要通过管理UI进入数据库。这仅适用于常规业务用户。如果您担心数据库损坏,请使用复杂的配置文件方法。文件往往比数据库损坏更少。
现在,如果您的用户是其他开发人员,那么您可以更灵活地使用存储配置的内容。
答案 4 :(得分:1)
我使用自定义xml配置文件,其中每个环境使用不同的配置文件(dev / qa / prod)。配置文件是通过服务的主机/端口配置等动态实例化的模板 - 这使得多环境和故障转移非常容易,因为它可以由模板实例化代码处理。
当然,如果您的配置非常少而且不关心多个环境,那么app.config更标准,可能是最好的方式。
答案 5 :(得分:1)
我发现NameValueCollectionHandler是最简单和最好的,我通常会通过configSource属性链接到外部配置文件。
我尝试将ABSOLUTE MINIMUM配置放在配置文件中,其中大部分都配置在代码中,并且应用程序可以自我了解其部署环境(例如,通过计算机名称或IP地址,如果已知)。当然,这需要更多的预先规划和对环境的了解,但在部署时要少得多。
答案 6 :(得分:1)
我的键/值配置对于简单的配置文件非常有效。当文件开始增长并且难以维护时,它就成了问题。我们开始将配置文件拆分为“常用”和“特定”应用程序配置。文件访问对应用程序是透明的,“常见”值在大多数情况下是相同的,但“特定”值对于每个已部署的应用程序都不同。
答案 7 :(得分:1)
我使用自定义xml配置文件。每个设置都有一个键,值和类型。
它有一个主要部分,其中包含所有设置和其他部分,其中包含特定环境(dev,staging,live)的设置覆盖。这在部署时我不需要替换文件的各个部分。 我有一个小包装器,您可以调用它来获取特定设置或包含所有这些设置的字典。
我最近创建了一个T4 template,它将读取配置文件并创建一个静态强类型设置类。这是一个巨大的节省时间。
答案 8 :(得分:0)
我将大部分配置保存在IoC容器中,例如Spring.Net。
答案 9 :(得分:0)
如果您有.NET 3.0可用,我发现XamlReader / XamlWriter非常便于存储设置。如果出现以下情况,他们可以将任何.NET对象写入/读取XAML:
特别好的是,您不必使用任何属性来装饰您的设置对象。
答案 10 :(得分:0)
dataset.WriteXML()/ dataset.ReadXML()对我来说效果很好。
答案 11 :(得分:0)
大多数情况下,我更喜欢使用自定义xml文件和Xml序列化方法来读取和写入此配置文件...不限于键/值对,并且实现起来并不复杂......
答案 12 :(得分:0)
我很幸运地滚动了我自己的特殊类,它返回与调用程序集关联的“.settings”文件中的配置数据。该文件是XML,并且设置类将其公开为XDocument。此外,此设置类的索引器返回/ settings / setting nodes中的元素值。
适用于只需要键/值对访问设置的简单应用程序,适用于需要定义自己的结构并使用System.Xml.Linq查询XML文档的复杂设置。
滚动自己的另一个好处是,您可以使用FileSystemWatcher和回调Action类型在文件在运行时更改时自动触发方法。