【问题标题】:How to manage configuration from several class libraries in .NET?如何管理 .NET 中多个类库的配置?
【发布时间】:2011-11-04 11:04:14
【问题描述】:

我正在寻找一种管理具有多个类库的项目的配置的最佳实践。我正在寻找可维护性和易于实施。

让我们假设一个简单的例子:一个带有 2 个类库的控制台项目。每个类库都需要自己的配置设置,有些设置是几个通用的。

类库 1

  • CL1设置
  • 全局设置

类库 2

  • CL2设置
  • 全局设置

第一种方法是在主项目上创建所有必要的设置:

  • 全局设置
  • CL1设置
  • CL2设置

但这会带来几个问题:

  • 如果有很多设置,它会很快变得混乱。
  • 不易维护:如何知道每个库需要哪些设置?
  • 它会产生命名冲突。如果 CL1Setting 和 CL2Setting 名称相同怎么办?

对我来说理想的解决方案(虽然恐怕不可能)是在单独的文件中或至少在不同的部分中拥有自定义库设置。像这样的:

<configuration>
  <appSettings>
    <add key="globalSetting" value="cl1Global"/>
  </appSettings>
  <appSettings file="CL1.config" >
    <add key="cl1setting" value="cl1setting1"/>
  </appSettings>
  <appSettings file="CL2.config">
    <add key="cl2setting" value="cl2setting2"/>
  </appSettings>
</configuration>

有什么建议吗?

编辑

正如 Ken Henderson 所建议的,配置部分是另一种方法。然而,虽然它们有自己的优势,但它们需要编码,所以我觉得它并不理想。 (不过,这可能最终成为最佳选择)

编辑 2

joseph.ferris 建议查看 CodePlex (csd.codeplex.com) 上的配置部分设计器是很好的。我发现了更多问题,在这里报告(如果有人感兴趣)http://csd.codeplex.com/discussions/278354

【问题讨论】:

    标签: c# .net visual-studio-2010 configuration appsettings


    【解决方案1】:

    我认为您正在寻找的是自定义 configuration section 而不是 appSettings。这通常被 3rd 方库(首先想到的是 log4net)用来提供一种通过您的应用程序/Web 配置文件配置其设置的方法。请注意,这也为 MS 如何创建其配置部分提供了基础。

    我已经在几个不同的项目中成功使用了它,其中一个项目能够将新的算法实现添加到分析程序中。

    【讨论】:

    • 谢谢!这是我研究但忘记包含在答案中的另一种方法(我将对其进行编辑)。这很好,但它需要编写代码,而不仅仅是将设置添加到配置文件中。我觉得有点麻烦:)
    • rgargente - 查看 CodePlex (csd.codeplex.com) 上的配置部分设计器。配置部分的可视化设计和通过单例实现对内容的简单访问。我一直在使用它,并且再也不会手动编写配置部分了。
    • 我已经尝试过了。一切似乎都很好,直到运行时。这个错误让我发疯:为 FooConfigSection 创建配置节处理程序时发生错误
    • 解决了。我将再次编辑问题。此处报告的错误:csd.codeplex.com/discussions/278354
    【解决方案2】:

    您可以使用自己的命名约定来降低 appSettings 命名冲突的风险。和/或创建自定义配置部分。

    <configuration>
      <appSettings>
        <add key="Shared.Setting1" value="..."/>
    
        <add key="CL1.setting1" value="..."/>
        <add key="CL1.setting2" value="..."/>
    
        <add key="CL2.setting1" value="..."/>
        <add key="CL2.setting2" value="..."/>
    
      </appSettings>
    </configuration>
    

    我不确定管理员是否需要知道哪个设置属于哪个库,但命名约定有助于促进逻辑分组 - 我会使用对管理员有意义的前缀,而不是类库名称 -例如“记录。”用于与日志记录相关的 appSettings。

    【讨论】:

    • 我看到你使用点作为分隔符。 Microsoft 自己使用冒号作为分隔符。正如您在他们的一些 Azure 示例中看到的那样,它们的前缀为 ida:
    • @Fred,我同意,值得保持一致,所以冒号是一个不错的选择,因为微软使用它。不过,微软自己并不一致 - 例如。 MVC appSettings 例如 ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled 没有任何前缀。
    【解决方案3】:

    Microsoft 在某些代码中使用冒号作为命名空间的分隔符。 例如他们的Azure samples。这里他们使用ida: 作为前缀。

    ConfigurationManager.AppSettings["ida:ClientId"];
    

    在 Microsoft ASP.NET 中的 Web.config 文件中可以看到:

    <appSettings>
      <add key="webpages:Enabled" value="false" />
    </appSettings>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多