替换配置框架,寻找替代方案

时间:2012-03-21 02:18:16

标签: c# .net configuration frameworks

我已经使用以下自行开发的配置框架来管理我项目的配置几年了:

  1. 第一个模仿Java的.properties文件(一堆支持集合的supergroup.subgroup.property=value行)并且适用于许多情况(我发现它最适合小型应用程序)。这个非常适合非常简单的配置

  2. 基于DataContractSerializer(以及可选XmlSerializer)的第二个版本,它允许第一个的所有功能都具有XML的所有特权,并且可以减少管道工作。这个很好但是不切实际且很麻烦,如果没有明确的UI,就可以减轻教学最终用户修改XML的麻烦。

  3. 现有的两个框架都可以通过属性/字段(通过手动/自动序列化分别)封送到POCO和来自POCO,以允许访问配置值,因此它们非常容易作为开发人员使用。

    现在我正在审查他们启用数据库和流畅配置的能力,我正在寻找开箱即用(最好是开源)的替代方案。如果我可以减少不必要的代码重复并允许他们访问数据库和流畅的配置(除了他们现有的能力),我可以重新处理所有现有项目。

    任何建议或是否值得我自己去获取我追求的功能?

    在我的研究中,我发现this可能重复的问题由Nini回答,但它近两年没有更新,只支持我已经涵盖的选项(基于其文档)无论如何)。我在研究中是否遗漏了某些内容,还是有更好的选择?

    更新

    我所追求的显式特征是:

    • XML文件
    • INI /类似Java的properties个文件
    • 数据库(至少MS SQL和SQLite,可选MySQL和其他任何你想象的)
    • Fluent(不需要代码生成)
    • 允许我添加自己的来源的某种扩展API
    • 绝对需要通过属性/字段序列化到/从任何数据源。
    • 枚举支持

    我有兴趣扩展现有框架,如果它足够开放,可以做我需要做的事情,但否则它可能不适合。


    更新

    现有System.Configuration命名空间的功能很棒,而且我很熟悉它的工作效果,但总的来说它不能满足我的要求。我已经使用过它(即使在高级场景中),但它只允许有限的XML扩展性:它不是我所追求的。

    如果我必须给出任何预定义的功能,我会说流畅的配置是最不重要的(无论如何,为这一点提供有价值的界面是非常困难的)。我会把一些东西放在我发现的东西之上。

    事实上,它已经超过24小时(并且> 125次观看)并且没有人能够提供合理的替代品,这告诉我它可能不存在。我将自己开始,希望有人可以提供一个有趣的替代方案。

3 个答案:

答案 0 :(得分:2)

创建通用配置管理器是一项非常非常艰巨的任务。多年来,我还没有看到任何配置框架出现,我不会这样做。只需查看System.Configuration命名空间,您就可以看到尝试匹配一组类似功能的成本有多高。大多数情况下,配置要求都是特定于项目的,并且没有灵丹妙药。

我的建议是坚持自己的解决方案,只要它易于单元测试并完成工作。

答案 1 :(得分:2)

请查看Cinchoo Configuration Framework,它提供了您要查找的大部分功能。

以下是使用Cinchoo框架

定义和使用配置对象的简单方法
namespace HelloWorld
{
    #region NameSpaces

    using System;
    using Cinchoo.Core.Configuration;

    #endregion NameSpaces

    [ChoConfigurationSection("sample")]
    public class SampleConfigSection : ChoConfigurableObject
    {
        [ChoPropertyInfo("name", DefaultValue="Mark")]
        public string Name;

        [ChoPropertyInfo("message", DefaultValue="Hello World!")]
        public string Message;
    }

    static void Main(string[] args)
    {
        SampleConfigSection sampleConfigSection = new SampleConfigSection();
        Console.WriteLine(sampleConfigSection.ToString());
    }

}

第一次,当您运行应用程序时,Cinchoo框架会自动生成如下配置部分。然后,您可以通过配置源或代码来控制它们。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="sample" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7dacd80ff3e33de" />
  </configSections>
  <sample>
    <add key="name" value="Mark" />
    <add key="message" value="Hello World!" />
  </sample>
</configuration>

答案 2 :(得分:0)

我为您提供的解决方案属于Spring Framework .NET,其中包括 PropertyPlaceholderConfigurer 类。

此类旨在外化您的xml配置文件中的某些属性。因此,写下文字值(如连接字符串,密码或任何其他参数),放置占位符,如$ {sql.server},$ {sql.password},它将自动替换为外部值。

这些外部价值观可以在任何地方。在我公司的情况下,由于我们有使用相同值的遗留系统,我们将它们放在Windows注册表中(我显然不建议用于新项目)。

但是,请注意,这不是Spring的独立功能,它附带Spring.Core,您必须使用spring配置文件和依赖注入功能。

http://www.springframework.net/doc-latest/reference/html/objects.html#objects-factory-placeholderconfigurer