18
  • 您可以使用 App.config;但它只支持键/值对。
  • 您可以使用.Net配置,配置部分;但它可能非常复杂。
  • 您可以自己使用Xml序列化/反序列化;你的课——你的方式。
  • 您可以使用其他方法;他们会是什么?...

您更喜欢这些或其他方法中的哪一种(如果有)?为什么?

4

13 回答 13

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;
于 2008-09-22T20:56:53.403 回答
12

如果我可以摆脱它,我将只使用 App.Config,但是,如果我需要更复杂的东西,我将使用自定义配置部分。是的,刚开始了解是很痛苦的,但是在我看来,统一的配置源和熟悉的所有设置配置值得花时间投资。

于 2008-09-22T20:29:22.173 回答
4

将您的配置放入数据库。如果您在多台机器上运行您的应用程序(例如客户端-服务器应用程序),那么所有每台机器的配置系统都是 PITA。单个配置区域是放置配置的最佳方式。写一个 gui 来管理它,你会很高兴的。

将 app.config 文件推广到 200 个客户端盒子……这并不好玩,尤其是当有人错过时(他们确实如此,相信我)。

于 2008-09-22T21:06:37.233 回答
2

我过去是一名网络/系统管理员,现在我为数据库应用程序开发内部实用程序。我发现的是这样的:

简单的非嵌套配置文件最适合那些不会改变他们访问资源的位置的应用程序。

任何更复杂的东西都需要通过管理 UI 进入数据库。这仅适用于普通业务用户。如果您担心数据库损坏,请使用复杂的配置文件方法。文件比数据库更容易损坏。

现在,如果您的用户是其他开发人员,那么您将在使用什么来存储配置方面拥有更大的灵活性。

于 2008-09-22T20:38:30.717 回答
1

我使用自定义 xml 配置文件,其中每个环境(dev/qa/prod)使用不同的配置文件。配置文件是动态实例化的模板,例如服务的主机/端口配置 - 这使得多环境和故障转移非常容易,因为它可以由模板实例化代码处理。

当然,如果您的配置很少并且不关心多个环境,那么 app.config 更标准并且可能是最好的方法。

于 2008-09-22T20:33:19.030 回答
1

我发现NameValueCollectionHandler是最简单和最好的,我通常会通过 configSource 属性链接到外部配置文件。

我尝试将 ABSOLUTE MINIMUM 配置放在配置文件中,其中大部分配置在代码中,应用程序可以自行感知其部署环境(例如机器名称或 IP 地址,如果知道的话)。当然,这需要更多的预先规划和对环境的了解,但在部署时要少得多。

于 2008-09-22T20:34:54.470 回答
1

我认为键/值配置对于简单的配置文件非常有效。当文件开始增长并且难以维护时,它就会成为一个问题。我们开始将配置文件拆分为“通用”和“特定”应用程序配置。文件访问对应用程序是透明的,“通用”值在大多数情况下是相同的,但每个部署的应用程序的“特定”值不同。

于 2008-09-23T10:53:36.980 回答
1

我使用自定义 xml 配置文件。每个设置都有一个键、值和类型。

它有一个包含所有设置的主要部分和包含特定环境(开发、登台、实时)的设置覆盖的附加部分。这我不需要在部署时替换文件的某些部分。我有一个小包装器,您可以调用它来获取特定设置或包含所有这些设置的字典。

我最近创建了一个T4 模板,它将读取配置文件并创建一个静态强类型设置类。这是一个巨大的节省时间。

于 2008-12-02T23:51:08.197 回答
0

我将大部分配置保存在 IoC 容器中,例如 Spring.Net。

于 2008-09-22T20:30:16.260 回答
0

如果您有可用的 .NET 3.0,我发现 XamlReader/XamlWriter 对于存储设置非常方便。在以下情况下,他们可以将任何 .NET 对象写入/读取到 XAML:

  • 该对象有一个无参数的构造函数
  • 要读/写的属性具有公共 getter 和 setter

不必用任何属性来装饰设置对象,这一点特别好。

于 2008-09-22T20:39:05.007 回答
0

当 app.config 不再适用时,dataset.WriteXML()/dataset.ReadXML() 对我来说效果很好。

于 2008-09-22T21:02:34.967 回答
0

大多数情况下,我更喜欢使用自定义 xml 文件和 Xml 序列化方法来读取和写入此配置文件...不限于键/值对并且实现起来并不复杂...

于 2008-09-23T08:36:18.230 回答
0

我很幸运地推出了自己的特殊类,该类从与调用程序集关联的“.settings”文件中返回配置数据。该文件是 XML,设置类将其公开为 XDocument。此外,此设置类的索引器从 /settings/setting 节点返回元素值。

适用于只需要键/值对访问设置的简单应用程序,适用于需要定义自己的结构并使用 System.Xml.Linq 查询 XML 文档的复杂设置。

滚动自己的另一个好处是,您可以使用 FileSystemWatcher 和回调 Action 类型在文件在运行时更改时自动触发方法。

于 2008-09-23T10:41:36.243 回答