.NET Core读取配置文件的方法

配置文件是每个项目最基础的部分,也是不可或缺的部分,比如:数据库连接、中间件属性等常见的配置。

今天这篇文章主要内容就是,在.Net Core项目中怎样去读取配置文件并使用。

提前准备

appsettings.json 文件

{
  "User": {
	"userName": "赵一",
	"userAge": 18
  }
}

对应实体模型

public class UserOption
{
	public string userName { get; set; }
	public int userAge { get; set; }
}

常规读取

1、注册

在 startup 类中注册,主要用到的是 Configure 方法:

services.Configure<UserOption>(Configuration.GetSection("User"));

2、控制器中注入并读取

public class HomeController : ControllerBase
{
    private readonly UserOption user;

    public HomeController(IOptions<UserOption> userOptions)
    {
        user = userOptions.Value;
    }

    [HttpGet]
    public string Get()
    {
        return $"姓名:{user.userName},年龄:{user.userAge} ";
    }
}

输出结果:姓名:赵一,年龄:18

嵌套读取

我们对 appsettings.json 文件做一点小小的改动,增加一个子节点 child

{
  "User": {
	"userName": "赵一",
	"userAge": 18,
	"child": {
	  "userName": "赵一的崽",
	  "userAge": 2
	}
  }
}

再对注册的代码做一点小小的修改:

services.Configure<UserOption>(Configuration.GetSection("User:child"));

输出结果:姓名:赵一的崽,年龄:2

分实例读取

这个时候需求又有变化了,需要同时读取 Userchild 节点的数据,我们试试下面的方法看可行不可行:

// 注册
services.Configure<UserOption>(Configuration.GetSection("User"));
services.Configure<UserOption>(Configuration.GetSection("User:child"));
// 控制器
public class HomeController : ControllerBase
{
    private readonly UserOption user;
    private readonly UserOption child;

    public HomeController(IOptions<UserOption> userOptions, IOptions<UserOption> childOptions)
    {
        user = userOptions.Value;
        child = childOptions.Value;
    }

    [HttpGet]
    public string Get()
    {
        return $"姓名:{user.userName},年龄:{user.userAge} \r\n姓名:{child.userName},年龄:{child.userAge}";
    }
}

输出结果很显然满足不了我们的需求:

姓名:赵一的崽,年龄:2
姓名:赵一的崽,年龄:2

有的小伙伴肯定会说,在实体模型内在加一个子节点字段。这样肯定是没问题的,但是与常规读取方式就没什么两样了。

这里我要说的是分实例读取,引入 Configure 的另一个重载方法,与之前不同的是多了一个参数 name

public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, IConfiguration config) where TOptions : class;

下面我们重新注册:

services.Configure<UserOption>("father", Configuration.GetSection("User"));
services.Configure<UserOption>("son", Configuration.GetSection("User:child"));

在控制器构造函数中注入,也引入了一个新的接口对象:IOptionsMonitor

public class HomeController : ControllerBase
{
    private readonly UserOption user;
    private readonly UserOption child;

    public HomeController(IOptionsMonitor<UserOption> userOptions, IOptionsMonitor<UserOption> childOptions)
    {
        user = userOptions.Get("father");
        child = childOptions.Get("son");
    }

    [HttpGet]
    public string Get()
    {
        return $"姓名:{user.userName},年龄:{user.userAge} \r\n姓名:{child.userName},年龄:{child.userAge}";
    }

输出结果:

姓名:赵一,年龄:18
姓名:赵一的崽,年龄:2

其实还有一个接口对象能实现这样的效果:IOptionsSnapshot,那 IOptionsMonitorIOptionsSnapshot 有什么不同呢?请接着往下看。

IOptionsMonitor与IOptionsSnapshot的不同之处

我们先来看看微软官方的注释:

IOptionsMonitor

//
// 摘要:
//     Used for notifications when TOptions instances change.
//
// 类型参数:
//   TOptions:
//     The options type.
public interface IOptionsMonitor<out TOptions>
{
    //
    // 摘要:
    //     Returns the current TOptions instance with the Microsoft.Extensions.Options.Options.DefaultName.
    TOptions CurrentValue { get; }

    //
    // 摘要:
    //     Returns a configured TOptions instance with the given name.
    TOptions Get(string name);
    //
    // 摘要:
    //     Registers a listener to be called whenever a named TOptions changes.
    //
    // 参数:
    //   listener:
    //     The action to be invoked when TOptions has changed.
    //
    // 返回结果:
    //     An System.IDisposable which should be disposed to stop listening for changes.
    IDisposable OnChange(Action<TOptions, string> listener);
}

IOptionsSnapshot

//
// 摘要:
//     Used to access the value of TOptions for the lifetime of a request.
//
// 类型参数:
//   TOptions:
//     Options type.
public interface IOptionsSnapshot<out TOptions> : IOptions<TOptions> where TOptions : class, new()
{
    //
    // 摘要:
    //     Returns a configured TOptions instance with the given name.
    TOptions Get(string name);
}

从字面上理解,IOptionsMonitor 建议在配置信息更改后需要通知的场景下使用,所以多了个 OnChange 的方法;而 IOptionsSnapshot 翻译过来的意思是:用于在请求的生命周期内访问配置,有点难以理解哈,我们接下来用代码来验证一下。

IOptionsMonitor 与 IOptionsSnapshot的生命周期

我们对实体模型再做一点小小的修改,增加一个 guid 字段,并给上默认值:

public class UserOption
{
    public string userName { get; set; }
    public int userAge { get; set; }

    public Guid guid { get; set; } = Guid.NewGuid();
}

我们再次运行程序:

father — 姓名:赵一,年龄:19,编号:e0d71f47-e8f1-4a6d-875e-2074c985f4a0
son — 姓名:赵一的崽,年龄:3,编号:d865151b-f9bf-4eff-bb4e-8ab6dc61160c

然后不停的刷新页面会发现,father 的编号没有发生任何编号,而 son 的编号每次刷新都会改变。这是不是比较像我们注册时所用到的三种模式:

services.AddScoped();
services.AddTransient();
services.AddSingleton()

其中 father 类似 AddSingletonson 则类似 AddScopedAddTransient

大家可以在同一个方法里多次调用 childOptions.Get("son") 看看 son 到底时类似 AddScoped 还是 AddTransient

IOptionsMonitor的OnChange调用方式

userOptions.OnChange((user,name)=> { Console.WriteLine(user.userName +"-"+ name); });

无文件配置

无文件配置就是不需要以静态文件的方式进行配置。相关信息在配置一次后就不用再做修改,我们可以采用无文件配置的方式,比如我们熟悉的 AddCors 跨域配置

services.AddCors(op => {
	op.AddPolicy(CorsName, set => {
		set.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
            });
        });

我们对之前的注册方法进行一下改动:

services.Configure<UserOption>(c =>
{
	c.userName = "钱二";
	c.userAge = 60;
});

控制器注入采用常规的注入方式,最终输出结果:姓名:钱二,年龄:60

分享一个源码查看网站:https://source.dot.net/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Asp.Net Core轻松学习系列之配置文件

    前言 在 .NET Core 项目中,配置文件有着举足轻重的地位:与.NetFramework 不同的是,.NET Core 的配置文件都以 .json 结尾,这表示一个标准的 json 格式的文件:一个标准的 Asp.Net Core MVC 项目,一定带着一个 appsettings.json 文件,该文件便是项目默认配置文件,这和基于 .NetFramework 创建的 Asp.Net Web Application (默认配置名称:App.config) 有着根本的不同,今天我们就学习如

  • Asp.net Core与类库读取配置文件信息的方法

    前言 首先开一个脑洞,Asp.net core 被使用这么长时间了,但是关于配置文件(json)的读取,微软官方似乎并没有给出像.net framework读取web.config那样简单且完美.严重怀疑这是微软为了促进.net core 生态繁荣搞的一点小手段. appsetting.Development.json (appsetting.json的内容和这个差不多,下面会讲到多环境使用) { "SettingPath": { "VideoFilePath":

  • asp.net core配置文件加载过程的深入了解

    前言 配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json,或者是被大家广泛使用的 appsettings.{env.EnvironmentName}.json:配置文件 作为一个入口,可以让我们在不更新代码的情况,对程序进行干预和调整,那么对其加载过程的全面了解就显得非常必要. 何时加载了默认的配置文件 在 Program.cs 文件中,查看以下代码 public

  • ASP.NET Core中修改配置文件后自动加载新配置的方法详解

    前言 在 ASP.NET Core 默认的应用程序模板中, 配置文件的处理如下面的代码所示: config.AddJsonFile( path: "appsettings.json", optional: true, reloadOnChange: true ); config.AddJsonFile( path: $"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: t

  • 如何在ASP.NET Core类库项目中读取配置文件详解

    前言 最近有朋友问如何在.net core类库中读取配置文件,当时一下蒙了,这个提的多好,我居然不知道,于是这两天了解了相关内容才有此篇文章的出现,正常来讲我们在应用程序目录下有个appsettings.json文件对于相关配置都会放在这个json文件中,但是要是我建立一个类库项目,对于一些配置比如密钥或者其他需要硬编码的数据放在JSON文件中,在.net core之前配置文件为web.config并且有相关的类来读取节点上的数据,现如今在.net core中为json文件,那么我们该如何做?本

  • .NET Core读取配置文件的方法

    配置文件是每个项目最基础的部分,也是不可或缺的部分,比如:数据库连接.中间件属性等常见的配置. 今天这篇文章主要内容就是,在.Net Core项目中怎样去读取配置文件并使用. 提前准备 appsettings.json 文件 { "User": { "userName": "赵一", "userAge": 18 } } 对应实体模型 public class UserOption { public string userNam

  • ASP.NET Core读取配置文件

    ASP.NET Core 中,可以使用 ConfigurationBuilder 对象来构建. 主要分为三部:配置数据源 -> ConfigurationBuilder -> 使用. 数据源可来自字典或配置文件. 数据源要么继承 IConfigurationSource ,要么从配置文件中读取. 1,来自字典 我们先使用字典存储键值对,来设置配置, test = 配置,然后使用 ConfigurationBuilder.Add() 方法添加数据源, Add 方法可以添加继承了 IConfigu

  • .NET Core读取配置文件

    1. 说明 默认情况下读取配置Configuration的默认优先级:ConfigureAppConfiguration(自定义读取)>CommandLine(命令行参数)>Environment(环境变量)>appsetting.json(默认配置文件)>UseSetting的顺序 原因:读取配置的顺序是后来者居上模式,后来注册的会优先被读取到. 2. 获取配置 2.1 获取单个项 //值是数组 var a0 = Configuration.GetSection("Ra

  • .NET Core读取配置文件方式详细总结

    基于.NET Core的跨平台开发,配置文件与之前.NET Framework采用xml的config文件不同,目前主要是采用json文件键值对配置方式读取. 参考网上相关资料总结如下: 一. 引入扩展 System.Configuration.ConfigurationManager Nuget 下载扩展,Install-Package System.Configuration.ConfigurationManager 使用方式:添加配置文件App.config.读取方式与原.NET Fram

  • Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法

    ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据.在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去.具体用法如下: ByteArrayOutputStream:    可以捕获内存缓冲区的数据,转换成字节数组. ByteA

  • .Net Core库类项目跨项目读取配置文件的方法

    在项目开始之前我们可以先去了解一下IConfiguration接口,.Net Core Web应用程序类似于一个控制台,当程序运行到Startup时会自动注入IConfiguration,默认读取当前.Net Core Web应用程序中的appsettings.json文件.读取当前.Net Core Web应用程序的配置文件可以自动直接注入,但如果我们需要使另一个类库项目读取到指定.Net Core Web应用程序中的配置文件,需要怎么做?凭借Asp.Net Core无处不在的"依赖注入&qu

  • C#读取配置文件的方法汇总

    配置文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SQLConfiguration" type="ConfigurationDemo.SQLConfiguration,ConfigurationDemo"/> <section name=&

  • SpringBoot 常用读取配置文件的三种方法详解

    目录 前言 一.使用 @Value 读取配置文件 二.使用 @ConfigurationProperties 读取配置文件 1.类上添加@Configuration注解 2.使用@EnableConfigurationProperties注解 3.使用@ConfigurationPropertiesScan扫描 三.使用 Environment 读取配置文件 四.常用的几种数据结构配置读取 我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如

  • .NetCore基础之读取配置文件详解

    目录 涉及知识点 安装插件 读取Json文件 1.准备数据 2.创建IConfiguration接口实例 3.通过索引器进行读取 4.通过GetValue<T>()方法进行读取 5.读取数组 6.整体对象绑定 7.Json示例截图 读取XML文件 1.创建XML文件 2.简单读取 3.读取数组 4.整体绑定对象 5.示例截图 读取INI文件 1.创建ini文件 2.创建配置并读取 3.示例截图 读取环境变量 1.查看环境变量 2.简单读取 3.示例截图 备注 在应用程序开发中,配置文件是主要存

随机推荐