首页 > 其他分享 >.NET7后端框架:读取配置文件

.NET7后端框架:读取配置文件

时间:2023-01-30 15:35:27浏览次数:65  
标签:return 读取 配置文件 sessions AppSettings NET7 config public string

前言

在项目开发过程中,不可避免的会设置一些全局的可变的参数,如连接字符串、功能开关、Swagger配置、Redis配置等等。
.NET Core 将这些配置参数统一放在 appsettings.json 文件中进行管理,并提供了 IConfiguration 接口,在需要读取配置文件内容的类中,注入 IConfiguration 即可。
但是,.NET Core 默认是通过构造函数注入,而 appsettings.json 的内容是不会经常进行变动,如果每个需要获取配置值类,都先在构造函数注入 IConfiguration 才能使用,也挺烦的。
所以我们写一个公用类,对配置的读取进行简单的封装。

公用类

在 AMO.Core 新建文件夹 Helper 文件夹,帮助类都放此文件夹中。添加类 AppSettings.cs

using Microsoft.Extensions.Configuration;

namespace AMO.Core.Helper
{
    /// <summary>
    /// 读取配置文件帮助类
    /// </summary>
    public class AppSettings
    {
        #region 注入参数
        /// <summary>
        /// 配置文件
        /// </summary>
        private static IConfiguration? _config;
        #endregion

        #region 构造函数
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="configuration">配置文件</param>
        public AppSettings()
        {
            _config = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json", true, reloadOnChange: true)
                    .Build();
        }
        #endregion

        #region 静态方法
        /// <summary>
        /// 读取指定节点信息
        /// </summary>
        /// <param name="sessions">节点名称</param>
        /// <returns></returns>
        public static string ReadString(params string[] sessions)
        {
            try
            {
                if (_config != null && sessions.Any())
                {
                    string? str = _config[string.Join(":", sessions)];
                    if (!string.IsNullOrEmpty(str))
                    {
                        return str;
                    }
                }
            }
            catch
            {
                return string.Empty;
            }
            return string.Empty;
        }

        /// <summary>
        /// 读取实体信息
        /// </summary>
        /// <param name="sessions">节点名称</param>
        /// <returns></returns>
        public static T ReadObject<T>(params string[] sessions) where T : class, new()
        {
            T data = new();
            try
            {
                if (_config != null && sessions.Any())
                {
                    _config.Bind(string.Join(":", sessions), data);
                }
            }
            catch
            {
                return data;
            }
            return data;
        }

        /// <summary>
        /// 读取实体数组信息
        /// </summary>
        /// <param name="sessions">节点名称</param>
        /// <returns></returns>
        public static List<T> ReadList<T>(params string[] sessions) where T : class
        {
            List<T> list = new();
            try
            {
                if (_config != null && sessions.Any())
                {
                    _config.Bind(string.Join(":", sessions), list);
                }
            }
            catch
            {
                return list;
            }
            return list;
        }
        #endregion
    }
}

构造函数中,AddJsonFile 方法的 reloadOnChange 设置为 true, 当 appsettings.json 有修改的时候,不需要重启后端服务,即可获取最新值。

注册服务

在 AppStart.cs 的 Run 方法中,注册 AppSettings。生命周期为 Singleton。

        public static void Run(this WebApplicationBuilder builder)
        {
            var logger = NLog.LogManager.Setup().GetCurrentClassLogger();
            logger.Debug("[启动服务]");
            try
            {
                // 配置文件,放在第一句,并注册为Singleton
                builder.Services.AddSingleton(new AppSettings());
                // ... 其他
            }
        }

使用

修改 appsettings.json 添加测试配置

  /* 单值 */
  "FileLoad": "/nginx/fileload",
  /* 对象 */
  "Redis": {
    "Enabled": true,
    "ConnectionString": "127.0.0.1:6379,ssl=false,abortConnect=false,connectTimeout=5000",
    "DatabaseId": 10
  }

定义 Redis 配置类, 类中属性记得给默认值,避免在使用的时候出现 null 的情况。

public class RedisConfig
{
    public bool Enabled { get; set; } = false;
    public string ConnectionString { get; set; } = "127.0.0.1:6379,ssl=false,abortConnect=false,connectTimeout=5000";
    public int DatabaseId { get; set; } = 10;
}

Controller 写测试接口

[HttpGet("read-string")]
public string ReadString(string key)
{
    string data = AppSettings.ReadString(key);
    return data;
}

[HttpGet("read-object")]
public RedisConfig ReadObject(string key)
{
    RedisConfig data = AppSettings.ReadObject<RedisConfig>(key);
    return data;
}

测试结果:

获取对象
[Request URL] http://localhost:5118/WeatherForecast/read-object?key=Redis
[Server response]
{
  "enabled": true,
  "connectionString": "127.0.0.1:6379,ssl=false,abortConnect=false,connectTimeout=5000",
  "databaseId": 10
}

获取单值
[Request URL] http://localhost:5118/WeatherForecast/read-string?key=FileLoad
[Server response] /nginx/fileload

最后

以上,对 appsettings.json 进行了简单封装。你可以在任何需要获取配置的类中使用 AppSettings。

题外

近期我司开源了一套简洁又功能完整的WMS系统: ModernWMS,采用 Vue3 + TS + Vuetify + .Net7 + EF Core 框架。欢迎来踩。
在线体验地址: https://wmsonline.ikeyly.com/
Github: https://github.com/fjykTec/ModernWMS
Gitee:https://gitee.com/modernwms/ModernWMS

标签:return,读取,配置文件,sessions,AppSettings,NET7,config,public,string
From: https://www.cnblogs.com/amo35/p/17076091.html

相关文章

  • SpringBoot配置文件详解
    简介SpringBoot全局配置文件默认为src/main/resources下的application.properties,后缀可以改为yml,如果application.yml和application.properties两个配置文件都存在,那么,prop......
  • 使用tinyxml2读取ATML测试数据
    源代码如下:#include<windows.h>#include"tinyxml2.h"#include<stdio.h>#include<string>#include<vector>//usingnamespacestd;usingnamespacetinyxml2;......
  • Asp.Net7 与 Vue3 组成的 BFF模式
    大家好,我是没有好工作的后端开发工程师,兼云原生方向的运维,被社会毒打被迫学习前端,写文保平安。介绍BFF模式BackendForFrontend(服务于前端的后端)初看我们会感觉它是M......
  • python 读取 execl表格
    python读取表格pip2installxlrd获取sheet,data.sheets()[1]获取总行range(excel.nrows)获取行1的表数据excel.cell_value(rown,1)#!/usr/bin/envpython3i......
  • [记]python的音频波形读取与音视频剪辑
    1.音频波形读取importlibrosaaaa=librosa.load("233.mp3")#print(aaa)print(aaa[0])#波形数据print(aaa[1])#码率#print(len(aaa[0])/aaa[1])s_play=len(a......
  • Spring Boot读取resources目录下的文本文件
    Java8SpringBoot2.7.3IntelliJIDEA2022.3.2(CommunityEdition)-- 开门见山使用 ClassLoader的getResourceAsStream读取。注,还可以使用其下的静态方......
  • nginx的nginx.conf配置文件如何修改代理的路由
    方法location/api/{set$request_uri_new$request_uri;if($request_uri~"^/api/(.*)$"){set$request_uri_new/$1;}proxy_passhtt......
  • springboot配置文件读取顺序
    若application.yml和bootStrap.yml在同一目录下,则bootStrap.yml的加载顺序要高于application.yml,即bootStrap.yml会优先被加载。原理:bootstrap.yml用于应用程序上......
  • .NET7后端框架:NLog
    前言继上一篇《.NET7后端框架:一句话启动》后,继续完善后端框架。查日志作为码农的日常,所以我们先引入日志包,这里我们使用NLog。添加依赖项添加包的方式有两种,一种是通......
  • F#写WPF程序,`.net7.0-windows`
    F#没有WPF模板,实现.net7.0-windows需要手工实现,本文就是讲解如何新建一个F#WPF程序。新建控制台应用程序。非(.netframework)修改项目属性,项目文件(*.fsproj)代码如下:<......