c# 使用.yaml 配置文件

废话不多说,上教程。🤩


1.安装 nuget包 YamlDotNet

2.新建appsettings.yaml 配置文件

3.读取appsettings.yaml

string yaml = File.ReadAllText("appsettings.yaml");
var deserializer = new DeserializerBuilder()
                .WithNamingConvention(CamelCaseNamingConvention.Instance) //使用驼峰命名约定
                .Build()
var config = deserializer.Deserialize<Dictionary<string, object>>(yaml);
var value_obj = config["AppSettings"];
Console.WriteLine(value_obj);

4.封装读取.yaml文件方法

public static class ConfigTool
{
    private readonly static string yaml = File.ReadAllText("appsettings.yaml");
    private static Dictionary<string, object> originalConfig = new Dictionary<string, object>();

    public static IDeserializer GetDeserializer()
    {
        return new DeserializerBuilder()
            .WithNamingConvention(CamelCaseNamingConvention.Instance) //使用驼峰命名约定
            .Build();
    }

    /// <summary>
    /// 获取最新的配置信息,热更新
    /// </summary>
    /// <returns></returns>
    public static Dictionary<string, object> GetConfigDic()
    {
        var pathYaml = File.ReadAllText("appsettings.yaml");
        var deserializer = GetDeserializer();
        //Dictionary<string,object> originalConfig = new Dictionary<string,object>();

        var config = deserializer.Deserialize<Dictionary<string, object>>(yaml);
        foreach (var key in config.Keys)
        {
            originalConfig[key] = config[key];
        }
        return originalConfig;
    }


    /// <summary>
    /// 获取appsettings value
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public static dynamic GetValue(string keys)
    {
        //var yaml = File.ReadAllText("appsettings.yaml");
        var deserializer = GetDeserializer();
        var config = deserializer.Deserialize<Dictionary<string, object>>(yaml);
        object current = null;
        try
        {
            var key_list = keys.Split(':');
            current = config[key_list[0]];
            key_list[0] = "";
            foreach (var key in key_list)
            {
                if (string.IsNullOrEmpty(key)) continue;
                if (current is IDictionary<object, object> subDict && subDict.TryGetValue(key, out object value))
                    current = value;
            }

            return ConverObject(current);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }

    /// <summary>
    /// 转换类型
    /// </summary>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static dynamic ConverObject(dynamic obj)
    {
        if (obj is IEnumerable<object> objects)
        {
            return new List<object>(objects);
        }
        else if (obj is IDictionary<object, object> enumerable)
        {
            return enumerable;
        }
        else return obj;
    }
}

5.使用方式

 var Urls = ConfigTool.GetValue("Urls");
 Console.WriteLine(Urls[0]); // https://baidu.com


 var logLevel = ConfigTool.GetValue("Logging:LogLevel");
 Console.WriteLine(logLevel["Default"]); // Information

 var MaxRetries = ConfigTool.GetValue("AppSettings:MaxRetries");
 Console.WriteLine(MaxRetries); // 5

到这里就🎉🎉🎉大功告成了!🎉🎉🎉 你学废了吗😀
posted @ 2024-12-26 14:59  浅·笑  阅读(140)  评论(0)    收藏  举报