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
相关产品推荐
相关产品推荐

