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

本文关键字:方案 寻找 配置 框架 | 更新日期: 2023-09-27 18:28:40

几年来,我一直在使用以下自制的配置框架来管理我的项目配置:

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

  2. 第二个基于DataContractSerializer(以及可选的XmlSerializer),它允许第一个的所有功能,并具有XML的所有好处和更少的管道功能。这是一个很好的,但不切实际,管理起来很麻烦,没有一个明确的UI来减轻教最终用户修改XML的麻烦。

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

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

有什么建议吗?或者值得我自己推广一下以获得我想要的功能吗?

在我的研究中,我发现了这个可能重复的问题,Nini回答了这个问题,但它已经近两年没有更新了,只支持我已经涵盖的选项(无论如何都是基于它的文档)。我在研究中遗漏了什么吗?或者有更好的选择吗?

更新

我追求的明确功能是:

  • XML文件
  • INI/Java类properties文件
  • 数据库(至少是MS SQL和SQLite,也可以是MySQL和任何其他你能想象到的)
  • Fluent(不需要生成代码)
  • 某种扩展API允许我添加自己的源代码
  • 它肯定需要序列化到任何数据源/从任何数据源序列化才能通过属性/字段访问
  • 枚举支持

如果现有框架足够开放,可以做我需要做的事情,我会有兴趣扩展它,但除此之外,它可能不太适合。


更新

现有System.Configuration命名空间的功能非常好,我很熟悉它的工作效果,但总的来说,它不能满足我的要求。我使用过它(甚至在高级场景中),但它只允许有限的XML扩展性:这不是我想要的。

如果我必须给出任何预定义的功能,我会说流畅的配置是最不重要的(无论如何,要为它提供一个有价值的接口都是非常困难的)。我会在我发现的任何东西上拼凑一些东西。

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

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

创建一个通用配置管理器是一项非常艰巨的任务。这些年来,我还没有看到任何配置框架出现,我也不认为我会出现。只要看一下System.Configuration命名空间,你就会发现尝试匹配一组类似的功能是多么昂贵。大多数情况下,配置要求都是非常特定于项目的,没有什么灵丹妙药。

我的建议是坚持自己的解决方案,只要它很容易进行单元测试并能完成任务。

请查看Cinchoo配置框架,它提供了您想要的大部分功能。

以下是使用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>

我为您提供的解决方案位于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-工厂占位符配置程序