前言
嘿,各位程序员小伙伴们!
在我们实际的项目开发中,配置管理就像是系统的“心脏”,不能或缺。
一个系统要能够很好地运转,离不开各种各样的配置参数,比如数据库连接字符串等等。
那么,如何高效地管理这些配置参数呢?
当然,我们不能直接将它们硬编码在代码里,因为那样会给后期维护带来麻烦。
最佳实践是将这些配置信息存放在外部文件中,比如 XML 文件或 JSON 文件,甚至是数据库中,这样不仅便于维护,还能提高程序的灵活性和扩展性。
在 .NET Core 中,我们有着强大的配置功能,可以轻松处理这些任务。
然而,对于 .NET Framework 来说,默认的配置功能就显得有些“拧巴”了,仅能简单地读取 Key-Value 数据。
为此,本文将教你如何基于 XML 文件,快速构建一个适用于 .NET Framework 的自定义配置系统。
话不多说,我们开始吧!
封装方法
封装一个方法,用于读取、解析和反序列化配置文件,留意代码注释
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace Common.Util
{
/// <summary>
/// 配置文件序列化/反序列化工具类
/// </summary>
public static class ConfigUtil
{
/// <summary>
/// 反序化化 XML 为指定类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="configfilePath">配置文件路径</param>
/// <returns></returns>
/// <exception cref="FileNotFoundException"></exception>
public static T Deserialize<T>(string configfilePath)
{
// 记录配置文件的路径,有问题帮助定位
// Logger.DEFAULT.InfoFormat("The config file path is [{0}]", configfilePath);
// 1. 判断配置文件是否存在
if (!File.Exists(configfilePath))
{
throw new FileNotFoundException(string.Format("[{0}] does not exists!", configfilePath));
}
// 2. 读取配置文件内容并反序列化
using (Stream fStream = new FileStream(configfilePath, FileMode.Open, FileAccess.Read))
{
// 定位文件流在起始点
fStream.Position = 0;
XmlSerializer xmlFormat = new XmlSerializer(typeof(T));
return (T)xmlFormat.Deserialize(fStream);
}
}
}
}
Step By Step 详细例子
1. 创建项目
首先,创建一个 .NET FrameWork 控制台应用程序项目,命名为 ConfigMgrDemo
2. 创建配置文件
接下来,需要创建一个配置文件如 democfg.config
,用于存储相关配置信息,假设内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<Host>
<URL>192.168.0.120</URL>
<LoginUser>Jacky</LoginUser>
<Password>+6nkUhDs5lmcfMYS/qe7Qw==</Password>
</Host>
<AdminUser>Admin</AdminUser>
</configuration>
3. 创建配置文件实体类
接着,创建一个配置文件实体类 CfgModel
,确保实体成员与配置文件中的节点一致,留意代码注释
using System.Xml.Serialization;
namespace ConfigMgrDemo
{
/// <summary>
/// 配置文档根节点相应的实体
/// 使用 XmlRoot 将实体与配置文档根节点关联
/// </summary>
[XmlRoot("configuration")]
public class CfgModel
{
/// <summary>
/// Host 信息
/// 如果属性名称跟配置文档节点名称不一致,使用 XmlElement 映射属性到文档节点名称
/// </summary>
[XmlElement("Host")]
public HostSetting Host { get; set; }
/// <summary>
/// 管理员
/// 如果属性名称跟配置文档节点名称一致,可不使用 XmlElement
/// </summary>
public string AdminUser { get; set; }
}
/// <summary>
/// 配置文档中的 Host 节点元素实体类
/// </summary>
public class HostSetting
{
/// <summary>
/// 服务器 URL
/// </summary>
public string URL { get; set; }
/// <summary>
/// 登录账号
/// </summary>
public string LoginUser { get; set; }
/// <summary>
/// 登录密码
/// </summary>
public string Password { get; set; }
}
}
4. 应用封装方法
在 Program.cs
中使用这个封装方法来读取配置文件
using Common.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConfigMgrDemo
{
public class Program
{
static void Main(string[] args)
{
string configfilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "democfg.config");
var result = ConfigUtil.Deserialize<CfgModel>(configfilePath);
Console.WriteLine($"Host URL is [{result.Host.URL}]");
Console.WriteLine($"AdminUser is [{result.AdminUser}]");
}
}
}
5. 测试
最后,编译并运行程序,即可以看到配置文件里的配置信息已经被正确解析和反序列化为对象
总结
配置信息对于一个系统的正常运行至关重要。
通常来说,配置信息是一些相对稳定的数据,设置后很少更改。因此,虽然存储在数据库中是一个选项,但这样做可能会影响系统性能。比较适合的方法是将这些数据存储在 XML 或 JSON 等数据交换格式的文件中。
如果结构比较简单,可以使用 JSON 来存储配置信息;但如果结构比较复杂,或者预计将来可能会进行扩展,那么 XML 更加适合。(选择 XML 还是 JSON 作为存储配置信息的介质,可以参考下一篇文章《比较 XML 和 JSON》)
通过本文的学习,你已经掌握了如何在 .NET Framework 中创建一个自定义配置系统。
这个方法不仅简单易懂,还能显著提升程序的稳定性和可扩展性。你可以将这个技巧应用到自己的项目中,让代码更加健壮!
好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!
最后,如果你有更好的想法或建议,欢迎留言讨论!
往期精彩
- 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
- C#12 中 5 个节省你开发时间的的改进
- C# 静态类,高手不想让你知道的 15 个真相
- 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
- 用 C# Stopwatch 计时,让代码性能飞起来!
- 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
- 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
- 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
- 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
- C# AutoMapper 10个常用方法总结
- C# 7个方法比较两个对象是否相等
- C# 去掉字符串最后一个字符的 4 种方法
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号,更多干货等你来!