powerconfig告别繁琐配置读写---为C#提供了一个快捷的读写配置文件的API

告别繁琐配置读写:PowerConfig------一个优雅的动态XML配置库

在开发应用程序时,配置文件是不可或缺的一部分。无论是数据库连接、日志级别还是用户偏好,我们都需要一种简单可靠的方式来读写配置。然而,传统的配置处理方式往往伴随着各种痛点,让开发者不胜其烦。

传统配置方式的弊病

1. 预定义配置类,僵化且繁琐

  • 无论是XML还是JSON,通常需要先定义对应的配置类(如 AppConfigDatabaseConfig),然后通过序列化/反序列化读写。添加一个新配置项,就得修改类定义,重新编译。
  • 对于快速变化的需求,这种静态方式严重拖累开发效率。

2. 手动持久化,容易遗漏

  • 修改配置后,必须显式调用保存方法(如 Save()),否则修改丢失。在多处修改时,容易忘记保存,导致数据不一致。

3. 类型转换与默认值处理

  • 读取配置值通常是字符串,需要手动转换类型(如 int.Parse),还要处理空值时的默认值,代码冗长且容易出错。

4. 多层嵌套访问,代码丑陋

  • 对于嵌套结构,访问深层配置往往需要一连串的 config.Database.Credentials.User 之类的代码,若中间某层为空,还得加判空逻辑。

5. JSON配置的动态访问不便

  • JSON虽好,但动态语言绑定麻烦。在C#中通常需要借助 JObject 或第三方库,代码可读性差,且无法利用IDE智能提示。

6. 第三方框架学习成本高

  • ConfigurationBuilder 这类框架虽然强大,但配置复杂,对小型项目来说过于重量级。

有没有一种配置库,能像操作变量一样读写配置,自动持久化,无需预定义类,支持无限嵌套,而且轻量到只需一行代码引入?

PowerConfig 应运而生。

PowerConfig 的特色与优势

✨ 零配置启动

  • 首次使用自动生成 pwrcfg.xml 文件,无需任何初始化代码。关注业务,而非配置。

🎯 三种风格 API,总有一款适合你

  • 静态方法Config.Set("Database.Server", "localhost"),简洁明了,适合键名动态生成的场景。
  • 索引器Config.Root["Version"] = "1.0.0",通过 Root 对象配合字符串键名,灵活且自然。
  • 动态属性Config.Root.Database.Credentials.User = "sa",像操作变量一样读写任意层级,无需预定义,中间节点自动创建。

🌳 无限层级嵌套,自动创建中间节点

  • 即使中间节点不存在,动态属性赋值也会自动创建。例如 Config.Root.Database.Master.Slave = "..." 无需担心 Master 是否存在。

🧠 智能读取

  • 叶子节点 (有值且无子元素)直接返回字符串,如 Config.Root.Database.Server 得到 "localhost"
  • 容器节点 (有子元素)返回节点代理,可通过 .GetValue() 获取统计信息(如 "3 children"),方便了解结构。
  • 不存在的节点返回代理,允许后续赋值,绝不报错。

🔒 自动持久化与线程安全

  • 每次调用 Set 或动态属性赋值,立即保存到XML文件,无需手动 Save
  • 内部锁机制保证多线程环境下的读写安全。

🪶 轻量级,无外部依赖

  • 仅依赖 .NET 内置库,无需安装任何额外包(当然,通过NuGet安装只需一行命令)。

快速开始

  1. 安装NuGet包

    bash 复制代码
    dotnet add package PowerConfig
  2. 引入命名空间

    csharp 复制代码
    using PowerConfig;
  3. 写入配置

    csharp 复制代码
    Config.Set("AppName", "MyApp");
    Config.Root["Version"] = "1.0.0";
    Config.Root.Database.Server = "localhost";
    Config.Root.Database.Port = "1433";
    Config.Root.Database.Credentials.User = "sa";
    Config.Root.Person.Name = "John";
    Config.Root.Person.Address.City = "New York";
  4. 读取配置

    csharp 复制代码
    string appName = Config.Get("AppName");
    string version = Config.Root["Version"];
    string user = Config.Root.Database.Credentials.User;
    string city = Config.Root.Person.Address.City;
    string personInfo = Config.Key("Person").GetValue(); // "3 children"
  5. 查看生成的 pwrcfg.xml

    xml 复制代码
    <Configuration>
      <AppName>MyApp</AppName>
      <Version>1.0.0</Version>
      <Database>
        <Server>localhost</Server>
        <Port>1433</Port>
        <Credentials>
          <User>sa</User>
        </Credentials>
      </Database>
      <Person>
        <Name>John</Name>
        <Address>
          <City>New York</City>
        </Address>
      </Person>
    </Configuration>

核心API一览

Config 静态类

成员 描述
dynamic Root 动态根对象,用于动态属性赋值和索引器。
void Set(string key, string value) 通过点号路径设置值。
string Get(string key) 通过点号路径获取值。
IEnumerable<string> GetKeys() 获取所有顶级键名。
bool ContainsKey(string key) 判断节点是否存在。
ConfigNode Key(string path) 获取节点对象,用于链式遍历。

ConfigNode 节点代理

成员 描述
ConfigNode Key(string name) 获取子节点代理。
IEnumerable<string> GetKeys() 获取当前节点下的直接子键名。
string GetValue() 获取节点值(叶子返回字符串,容器返回统计信息)。
void SetValue(string value) 设置节点值。
bool Exists() 判断节点是否存在。

常见使用案例

遍历 Database 下的所有子属性

csharp 复制代码
var dbNode = Config.Key("Database");
foreach (var key in dbNode.GetKeys())
{
    var child = dbNode.Key(key);
    if (child.GetKeys().Any())
        Console.WriteLine($"  {key}/ ({child.GetValue()})");
    else
        Console.WriteLine($"  {key} = {child.GetValue()}");
}

递归遍历整个配置树

csharp 复制代码
void Traverse(ConfigNode node, string indent = "")
{
    foreach (var key in node.GetKeys())
    {
        var child = node.Key(key);
        var val = child.GetValue();
        if (child.GetKeys().Any())
        {
            Console.WriteLine($"{indent}{key}/ ({val})");
            Traverse(child, indent + "  ");
        }
        else
            Console.WriteLine($"{indent}{key} = {val}");
    }
}
Traverse(Config.Key(""));

使用默认值

csharp 复制代码
int port = int.Parse(Config.Get("Database.Port") ?? "1433");

修改深层节点值

csharp 复制代码
Config.Key("Database").Key("Port").SetValue("5432");

叶子节点自动转为容器

csharp 复制代码
Config.Root.Temp = "temp";
Config.Root.Temp.Key = "value"; // Temp 自动转为容器,原值丢失

注意事项

  • 所有值均为字符串,读取后需自行转换类型。
  • 动态属性读取时,叶子节点直接返回字符串,容器节点返回代理。
  • 键名区分大小写。
  • 配置文件默认保存在应用程序工作目录,可自定义路径。
  • 线程安全,多线程环境放心使用。

结语

PowerConfig 致力于用最简单的方式解决配置读写问题,让开发者从繁琐的解析、持久化、类型转换中解放出来。无论你是小型工具还是大型应用,PowerConfig 都能成为你得心应手的配置利器。

欢迎体验,期待你的反馈!

使用中遇到问题,欢迎留言,或者在GitHub或者nuget中留言。

相关推荐
IOT-Power2 小时前
QT 事件驱动架构
开发语言·qt·架构
2401_889884662 小时前
模板代码模块化设计
开发语言·c++·算法
qq_246100052 小时前
CSDN risk probe 1773588273
开发语言·javascript·ecmascript
2401_898075122 小时前
代码生成器优化策略
开发语言·c++·算法
Kim Jackson2 小时前
我的世界Java版1.21.4的Fabric模组开发教程(二十二)创建生物(上)实体外观与动画设计
java·开发语言·fabric
lsx2024062 小时前
Python 100例:编程实践与技巧解析
开发语言
大鹏说大话2 小时前
单点登录(SSO)全景指南:从原理剖析到落地实战
开发语言
逆境不可逃2 小时前
【从零入门23种设计模式21】行为型之空对象模式
java·开发语言·数据库·算法·设计模式·职场和发展
健康平安的活着2 小时前
java中乐观锁+事务在批量导入,批量审批案例的使用
java·开发语言