如何在使用 .NET Core 的控制台应用程序中从 appsettings.json 获取值?
Posted
技术标签:
【中文标题】如何在使用 .NET Core 的控制台应用程序中从 appsettings.json 获取值?【英文标题】:How to get values from appsettings.json in a console application using .NET Core? 【发布时间】:2021-03-14 13:17:31 【问题描述】:我正在使用 .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 中。我不知道如何在其他类中初始化“配置”以便使用它。谢谢
【问题讨论】:
这能回答你的问题吗? How to read AppSettings values from a .json file in ASP.NET Core 【参考方案1】:您的示例混合了一些希望托管您的代码的 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;
【讨论】:
感谢您的回复!问题是我需要在另一个库类中获取这些变量,而不是在 Main 中。我不知道如何在其他类中初始化“配置”以便使用它。谢谢 @JaviL 您可以将这些设置/选项类或 IConfiguration 对象本身放入静态全局实例中,或者您可以考虑使用依赖注入和 IoC 容器(ASP NET Core 之一或另一个你的选择)将这些选项正确地注入到任何其他期望使用它们的类中。 较早的文章,但与第二个问题相关:andrewlock.net/…【参考方案2】:我在使用 .NET Core 时遇到了同样的问题,我发现这个解决方案运行良好:
-
我有这个 appsettings.json
"App":
"LoginCredentials":
"ClientId": "xxx",
"ClientSecret": "xxx",
"TenantId": "xxx"
,
"DataBase":
"PathToDatabases": "xxx"
,
"General":
"PathToLogFiles": "xxx"
-
我创建了一个类 AppSettingsHandler.cs
public class AppSettingsHandler
private string _filename;
private AppSettings _config;
public AppSettingsHandler(string filename)
_filename = filename;
_config = GetAppSettings();
public AppSettings GetAppSettings()
var config = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile(_filename, false, true)
.Build();
return config.GetSection("App").Get<AppSettings>();
-
那么你需要一个 AppSettings 的“模型”类:
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;
-
在您的 Program.cs 类中,您现在可以像这样从 appsettings.json 获取参数:
var aH = new AppSettingsHandler("appsettings.json");
var aS = aH.GetAppSettings();
var myPath = aS.DataBase.PathToDatabases;
当然,您可以调整该代码以使其符合您的要求,即。例如,您必须定义自己的类和子类,当然您还可以通过获取 appsettings.json 的其他部分来扩展 AppSettingsHandler.cs。
【讨论】:
感谢您的回复!问题是我需要在另一个库类中获取这些变量,而不是在 Main 中。我不知道如何在其他类中初始化“配置”以便使用它。谢谢SetBasePath()
不再存在于 .net core 5 中。替代方案是什么?
安装nuget包Microsoft.Extensions.Configuration.Json
和Microsoft.Extensions.Configuration.Binder
【参考方案3】:
http://www.techtutorhub.com/article/how-to-read-appsettings-json-configuration-file-in-dot-net-core-console-application/83
有帮助!
-
appsettings.json(添加appsettings.json后,转到属性并将文件标记为复制到out目录)
"ConnectionString": "Server=localhost;Database=tempDB;Uid=<dbUserName>;Pwd=<dbPassword>", "Smtp": "Host": "smtp.gmail.com", "Port": "587", "Username": "<YourGmailUserName>", "Password": "<YourGmailPassword>", "From": "Your Name"
2.需要的包
dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.Json
-
program.cs
using System; using Microsoft.Extensions.Configuration; class Program static void Main(string[] args) var builder = new ConfigurationBuilder() .AddJsonFile($"appsettings.json", true, true); var config = builder.Build(); var connectionString = config["ConnectionString"]; var emailHost = config["Smtp:Host"]; Console.WriteLine($"Connection String is: connectionString"); Console.WriteLine($"Email Host is: emailHost"); Console.ReadLine();
【讨论】:
【参考方案4】:开始使用 Visual Studio 2022 和 .net 6。
-
创建一个新的控制台项目。
将 appsettings.json 文件添加到项目中。
右键单击,选择属性并确保将其复制到输出目录。
编辑文件使其看起来像这样。
"ConnectionString": "Server=localhost;Database=tempDB;Uid=<dbUserName>;Pwd=<dbPassword>",
"Smtp":
"Host": "smtp.gmail.com",
"From": "Your Name"
,
"MySecondClass":
"SettingOne": "some string value",
"SettingTwo": 82
编辑您的项目 csproj 文件以包含 Microsoft.Extensions.Configuration 包。见下文,同时注意 appsettings.json 文件。
EXE文件 网6.0 使能够 使能够 保留最新最后您的 program.cs 文件将如下所示。
using System;
using System.IO;
using Microsoft.Extensions.Configuration;
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
var builder = new ConfigurationBuilder()
.AddJsonFile($"appsettings.json", true, true);
var config = builder.Build();
var connectionString = config["ConnectionString"];
var emailHost = config["Smtp:Host"];
Console.WriteLine($"Connection String is: connectionString");
Console.WriteLine($"Email Host is: emailHost");
var settingTwo = config["MySecondClass:SettingOne"];
Console.WriteLine(settingTwo);
【讨论】:
以上是关于如何在使用 .NET Core 的控制台应用程序中从 appsettings.json 获取值?的主要内容,如果未能解决你的问题,请参考以下文章
在 .NET 4.5.2 控制台应用程序中使用 .NET Core 库
如何在 .NET Core 控制台应用程序中加载位于文件夹中的程序集
如何在 ASP.NET Core 3.1 中使用 Java?