c# - 如何在使用 .NET Core 的控制台应用程序中从 appsettings.json 获取值?
问题描述
我正在使用 .NET Core 3.1 创建一个控制台应用程序,我希望有一个 appsettings json 在执行开始时加载所有环境、路径、变量……,然后从其他库类中获取值。我创建了一个“设置”类,其中包含 appsettings json 中的数据。这是我在教程中已经看到的,但我无法获得任何价值。
//Start.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
}
//Settings.cs
public class Settings
{
public ConnectionStrings ConnectionStrings { get; set; }
public Logging Logging { get; set; }
public AppSettings AppSettings { get; set; }
...
//A class to use it in other lib
public class Extractor
{
private readonly IConfiguration _configuration;
public Extractor(IConfiguration configuration) : this()
{
_configuration = configuration;
Init();
}
public void Init()
{
// Extractor:Min is a variable included in appsettings.json
Min = _configuration.GetValue<int>("Extractor:Min")
}
我无法制作正确的 Main 因为我不知道如何初始化所有内容……我错过了什么?我想我一直在绕圈子做一些简单的事情。提前致谢!注意:我需要从另一个库类中获取这些变量,而不是在 Main 中。我不知道如何在其他类中初始化“配置”以便使用它。谢谢
解决方案
您的示例混合了一些希望托管您的代码的 ASP NET Core 方法。要最小化解决从 JSON 配置中获取选项或设置的问题,请考虑以下事项:
一个config.json
文件,设置为“复制到输出目录”,以便它包含在构建中:
{
"MyFirstClass": {
"Option1": "some string value",
"Option2": 42
},
"MySecondClass": {
"SettingOne": "some string value",
"SettingTwo": 42
}
}
以下方法将从 JSON 文件加载内容,然后将内容绑定到两个强类型选项/设置类,这比逐个值更简洁:
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
// NuGet packages:
// Microsoft.Extensions.Configuration.Binder
// Microsoft.Extensions.Configuration.Json
namespace SampleConsole
{
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: false);
IConfiguration config = builder.Build();
var myFirstClass = config.GetSection("MyFirstClass").Get<MyFirstClass>();
var mySecondClass = config.GetSection("MySecondClass").Get<MySecondClass>();
Console.WriteLine($"The answer is always {myFirstClass.Option2}");
}
}
public class MyFirstClass
{
public string Option1 { get; set; }
public int Option2 { get; set; }
}
public class MySecondClass
{
public string SettingOne { get; set; }
public int SettingTwo { get; set; }
}
}
推荐阅读
- function - 是否有可能在 PhpStorm 项目中找到未使用的功能(程序)
- javascript - 通过 JS 为 .less 样式表设置 href
- java - 抛出 ConstraintViolationException 时如何获取经过验证的字段名称而不是 arg0
- vue.js - 如何在 vue.js 中停止执行?
- c# - 需要知道如何在 Xamarin.iOS 中杀死后台进程
- node.js - Node.js API 没有返回任何东西(没有错误)
- php - 带有空字符串的 WHERE 子句不返回任何行
- python - 如何使用 24 小时时间序列数据作为预测特征
- matlab - OCTAVE:加载和处理多个文件(32 个文件)
- sql - 获取完整倒数第二个日历月的数据 + 同月的数据,但前 2 年的数据