C# 如何使用.NET Core从控制台应用程序中的appsettings.json获取值?
我正在使用.NETCore3.1创建一个控制台应用程序,我希望有一个appsettings json来加载所有 环境、路径、变量,。。。然后从其他库类获取值。 我用appsettings json中包含的数据创建了一个“Settings”类。 这是我在教程中看到的,但我无法得到任何价值C# 如何使用.NET Core从控制台应用程序中的appsettings.json获取值?,c#,.net-core,startup,appsettings,C#,.net Core,Startup,Appsettings,我正在使用.NETCore3.1创建一个控制台应用程序,我希望有一个appsettings json来加载所有 环境、路径、变量,。。。然后从其他库类获取值。 我用appsettings json中包含的数据创建了一个“Settings”类。 这是我在教程中看到的,但我无法得到任何价值 //Start.cs public class Startup { public Startup(IHostingEnvironment env) { va
//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")
}
//Start.cs
公营创业
{
公共启动(IHostingEnvironment环境)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddenEnvironmentVariables();
Configuration=builder.Build();
}
公共IConfiguration配置{get;}
公共启动(IConfiguration配置)
{
配置=配置;
}
}
//设置.cs
公共类设置
{
公共连接字符串连接字符串{get;set;}
公共日志记录{get;set;}
公共AppSettings AppSettings{get;set;}
...
//在其他库中使用它的类
公共类提取器
{
专用只读IConfiguration\u配置;
公共提取器(IConfiguration配置):this()
{
_配置=配置;
Init();
}
公共void Init()
{
//提取器:Min是appsettings.json中包含的一个变量
Min=\u configuration.GetValue(“提取器:Min”)
}
因为我不知道如何初始化所有东西,所以我无法创建一个正确的主管道…我缺少什么?我想我一直在为这么简单的事情兜圈子。提前谢谢!
注意:我需要从另一个库类中获取这些变量,而不是从Main中获取。我不知道如何在其他类中初始化“配置”以使用它。感谢您的示例混合了一些ASP NET核心方法,这些方法希望托管您的代码。要最低限度地解决从JSON配置中获取选项或设置的问题n,考虑以下内容: 一个
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; }
}
}
使用系统;
使用System.IO;
使用Microsoft.Extensions.Configuration;
//NuGet软件包:
//Microsoft.Extensions.Configuration.Binder
//Microsoft.Extensions.Configuration.Json
命名空间示例控制台
{
班级计划
{
静态void Main(字符串[]参数)
{
var builder=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“config.json”,可选:false);
IConfiguration config=builder.Build();
var myFirstClass=config.GetSection(“myFirstClass”).Get();
var mySecondClass=config.GetSection(“mySecondClass”).Get();
WriteLine($“答案总是{myFirstClass.Option2}”);
}
}
公务舱我的头等舱
{
公共字符串选项1{get;set;}
公共int选项2{get;set;}
}
公共类MySecondClass
{
公共字符串设置一{get;set;}
public int SettingTwo{get;set;}
}
}
我对.NET Core也有同样的问题,我发现这个解决方案运行良好:
公共类appsetingshandler
{
私有字符串\u文件名;
私有应用程序设置_config;
公共appsetingshandler(字符串文件名)
{
_filename=文件名;
_config=GetAppSettings();
}
公共AppSettings GetAppSettings()
{
var config=new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile(_文件名,false,true)
.Build();
返回config.GetSection(“App”).Get();
}
}
public class LoginCredentialsConfiguration
{
public string ClientId { get; set; }
public string ClientSecret { get; set; }
public string TenantId { get; set; }
}
当然,您可以调整代码,使其符合您的需求,也就是说,您必须定义自己的类和子类,当然您还可以通过获取appsettings.json的其他部分来扩展AppSettingsHandler.cs。这是否回答了您的问题?感谢您的回答!问题是我需要获取这些变量我不知道如何在其他类中初始化“配置”以使用它。Thanks@JaviL您可以将这些设置/选项类或IConfiguration对象本身放入静态全局实例中,也可以使用依赖项注入和IoC容器进行研究(ASP NET Core可选择一个或另一个)将这些选项正确地注入到任何其他类希望使用它们的内容中。较旧的文章,但与第二个问题相关:感谢您的回答!问题是我需要在另一个库类中获取这些变量,而不是在Main中。我不知道如何在其他类中初始化“配置”以使用它。比ks
SetBasePath()
不再存在于.net core 5中。有什么替代方案?
public class AppSettings
{
public LoginCredentialsConfiguration LoginCredentials { get; set; }
public DatabaseConfiguration DataBase { get; set; }
public GeneralConfiguration General { get; set; }
}
public class LoginCredentialsConfiguration
{
public string ClientId { get; set; }
public string ClientSecret { get; set; }
public string TenantId { get; set; }
}
var aH = new AppSettingsHandler("appsettings.json");
var aS = aH.GetAppSettings();
var myPath = aS.DataBase.PathToDatabases;