首页 > 解决方案 > 如何在使用 .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 中。我不知道如何在其他类中初始化“配置”以便使用它。谢谢

标签: c#.net-corestartupappsettings

解决方案


您的示例混合了一些希望托管您的代码的 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; }
    }
}

推荐阅读