You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何从YAML文件读取数据库连接配置替代代码硬编码

从YAML文件读取数据库配置实现方案

你可以通过YAML反序列化的方式替换硬编码配置,具体操作如下:

1. 安装解析依赖

在测试项目中安装轻量YAML解析库YamlDotNet,可通过NuGet包管理器直接搜索安装,或执行包管理命令:

Install-Package YamlDotNet

.NET CLI用户可执行:

dotnet add package YamlDotNet

2. 定义强类型配置映射类

按照file.yaml的结构定义对应C#类,反序列化后可直接通过属性取值,避免手动逐字段解析:

/// <summary>
/// 数据库配置节点映射类
/// </summary>
public class DatabaseConfig
{
    public string Host { get; set; }
    public int Port { get; set; }
    public string DbName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

/// <summary>
/// 根配置节点映射类
/// </summary>
public class AppConfig
{
    public DatabaseConfig Database { get; set; }
}

3. 配置文件属性

右键项目中的file.yaml打开属性面板,将复制到输出目录选项设置为如果较新则复制,确保程序运行时能在执行目录找到配置文件,避免文件找不到异常。

4. 修改测试代码

将原有硬编码的配置参数替换为从YAML反序列化结果中读取,使用NUnit的[OneTimeSetUp]特性在测试类初始化时一次性加载配置,避免重复读文件。修改后的完整代码如下:

using System;
using System.IO;
using YamlDotNet.Serialization;
using NUnit.Framework;
// 请替换为你项目中数据库驱动对应的实际命名空间
// using 你的数据库连接类所在命名空间;

namespace NunitTestCase
{
    [TestFixture]
    public class Test
    {   
        private readonly string query = "SELECT * FROM SYSTEM.ADMIN.EMPLOYEE";
        private DatabaseConfig _dbConfig;

        [OneTimeSetUp]
        public void LoadConfig()
        {
            // 构建YAML反序列化实例
            var deserializer = new DeserializerBuilder().Build();
            // 读取配置文件文本内容
            var yamlText = File.ReadAllText("file.yaml");
            // 反序列化为强类型配置对象
            var appConfig = deserializer.Deserialize<AppConfig>(yamlText);
            _dbConfig = appConfig.Database;
        }
        
        [Test]
        public void TestCase()
        {
            var builder = new ConnectionStringBuilder();
            builder.UserName = _dbConfig.UserName;
            builder.Password = _dbConfig.Password;
            builder.Port = _dbConfig.Port;
            builder.Host = _dbConfig.Host;
            builder.Database = _dbConfig.DbName;

            using (var con = new Connection(builder.ConnectionString))
            {
                con.Open();
                Assert.That(con.State == ConnectionState.Open);
                using (var cmd = new Command(query, con))
                {
                    var rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {
                        for (int i = 0; i < rdr.FieldCount; i++)
                        {
                            object result = null;
                            try
                            {
                                result = rdr.GetValue(i);
                            }
                            catch (Exception ex)
                            {
                                result = ex.Message;
                            }
                            Console.WriteLine(result);
                        }
                    }
                }
                con.Close();
                Assert.That(con.State == ConnectionState.Closed);
            }
        }
    }

    public class DatabaseConfig
    {
        public string Host { get; set; }
        public int Port { get; set; }
        public string DbName { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
    }

    public class AppConfig
    {
        public DatabaseConfig Database { get; set; }
    }
}

常见问题说明

  • 如果运行时抛出文件找不到异常,先检查file.yaml的复制到输出目录配置是否正确,调试阶段可先传入文件的绝对路径验证逻辑,正常后再换回相对路径。
  • 正式环境不要将数据库明文密码存放在配置文件中,可结合配置加密、环境变量覆盖等方式提升安全性。
  • 如果是.NET 6及以上版本的项目,也可以使用微软官方的Microsoft.Extensions.Configuration.Yaml包读取配置,绑定逻辑和上述方案类似,但会多引入几个配置相关的依赖,单测试项目场景下直接用YamlDotNet更轻量。

内容的提问来源于stack exchange,提问作者kr_devops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:12:34