NetCore动态全局获取appsetting.json的另外一种思路

NetCore动态全局获取appsetting.json的另外一种思路C#最近在写NET CORE的项目,在非controller和service里面需要用到appsetting.json文件里面的一些配置,查资料

大家好,欢迎来到IT知识分享网。

NetCore动态全局获取appsetting.json的另外一种思路

C#

最近在写NET CORE的项目,在非controller和service里面需要用到appsetting.json文件里面的一些配置,查资料大概有几种思路:

  • 注入,然后config.GetSection(“xxx”)获取section。
  • 写一个文件监听fileWatch,去监听appsetting.json的变化,读取key-value。
  • 使用工具类再创建一遍ConfigurationBuilder: new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(#34;appsettings.json”, optional: true, reloadOnChange: true)
  • 使用IOptions<TOptions>,创建对应的实体类,然后获取实体类。

查资料的时候发现了一个IOptionsMonitor<T>,这个可以监听到文件的变化,结合IOptionsMonitor<T>,我写了一个工具类,具体使用办法如下:

(1)创建appsetting.json对应的实体类文件,属性的名字要与配置文件里面的一一对应。

// 实体类
public class AllSetting
{
        ///// <summary>
        ///// 数据库配置
        ///// </summary>
        public ConnectionSetting ConnectionStrings { get; set; }

        ///// <summary>
        ///// 日志模块
        ///// </summary>
        public LoggingSetting Logging { get; set; }

        ///// <summary>
        ///// AllowedHosts 
        ///// </summary>
        public string AllowedHosts { get; set; }
}
// 对应的配置文件
{
    "ConnectionStrings": {
        "DefaultConnection": "xxxx"
        //"PgSqlConnection": "xxxx",
        //"MySqlConnection": "xxxx",
        //"OracleConnection": "xxxx"
    },
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "AllowedHosts": "*",
    "Gateway": {
        "Uri": "xxxx"
    }
}

(2)编写工具类AppsettingsUtility。

/// <summary>
    /// 全局获取app的设置工具类
    /// </summary>
    public class AppsettingsUtility
    {
        /// <summary>
        /// log4net
        /// </summary>
        private readonly ILog log;

        /// <summary>
        /// serviceProvider
        /// </summary>
        private static ServiceProvider serviceProvider;

        /// <summary>
        /// _services
        /// </summary>
        private static IServiceCollection _services;

        /// <summary>
        /// _configuration
        /// </summary>
        private static IConfiguration _configuration;

        /// <summary>
        /// 初始化工具类
        /// </summary>
        /// <param name="provider"></param>
        public AppsettingsUtility(IServiceCollection services, IConfiguration configuration)
        {
            _services = services;
            _configuration = configuration;
            // 仓库名 统一的
            log = LogManager.GetLogger("仓库名", typeof(AppsettingsUtility));
            if (_services == null || _configuration == null)
            {
                log.Error("初始化配置工具类发生异常:_services或_configuration为空");
                throw new NullReferenceException("初始化配置工具类发生异常");
            }
            try
            {
                serviceProvider = _services.BuildServiceProvider();
            }
            catch (Exception ex)
            {
                log.Error("_services.BuildServiceProvider()失败:" + ex.ToString());
            }
        }

        /// <summary>
        /// 获取IOptionsMonitor<T>
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <returns>IOptionsMonitor<T></returns>
        public static IOptionsMonitor<T> GetMonitor<T>()
        {
            if (serviceProvider == null)
            {
                throw new NullReferenceException("获取失败,ServiceProvider为空");
            }
            if (typeof(T) != typeof(AllSetting))
            {
                // TODO: 要限定传递的参数值或者每个setting都注册一遍
            }
            return serviceProvider.GetRequiredService<IOptionsMonitor<T>>();
        }

        /// <summary>
        /// 获取单个的设置实体
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <returns>T</returns>
        public static T GetSettingsModel<T>()
        {
            if (serviceProvider == null)
            {
                throw new NullReferenceException("获取失败,ServiceProvider为空");
            }
            if (typeof(T) != typeof(AllSetting))
            {
                // TODO: 要限定传递的参数值或者每个setting都注册一遍
            }
            return serviceProvider.GetRequiredService<IOptionsMonitor<T>>().CurrentValue;
        }

        /// <summary>
        /// 通过key获取设置
        /// </summary>
        /// <param name="key">key</param>
        /// <returns>设置内容</returns>
        public static string GetSetting(string key)
        {
            if (_configuration == null)
            {
                throw new NullReferenceException("获取失败,IConfiguration为空");
            }
            if (string.IsNullOrEmpty(key))
            {
                throw new NullReferenceException("获取失败,key不能为空");
            }
            return _configuration.GetSection(key).Value;
        }
    }

(3)在Startup中注册。

// 注入设置类到管道中
services.AddOptions();
services.Configure<AllSetting>(Configuration);
// 初始化工具类
new AppsettingsUtility(services,Configuration);

(4)使用。

var aa = AppsettingsUtility.GetMonitor<AllSetting>().CurrentValue;
var bb = AppsettingsUtility.GetSettingsModel<JwtSetting>();
var bb = AppsettingsUtility.GetSetting("Appsetting:xxx");

如果把配置文件改变了,再调用获取设置的时候,设置的值会更新,项目不用重启。这样做对性能的影响没有测试。

如果我这边的思路有什么错误的话,还望批评指出。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13080.html

(0)
上一篇 2024-03-08 19:33
下一篇 2024-03-08 20:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信