【问题标题】:How to get values from appsettings.json in a console application using .NET Core?如何在使用 .NET Core 的控制台应用程序中从 appsettings.json 获取值?
【发布时间】: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 中。我不知道如何在其他类中初始化“配置”以便使用它。谢谢

【问题讨论】:

标签: c# .net-core startup appsettings


【解决方案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 时遇到了同样的问题,我发现这个解决方案运行良好:

  1. 我有这个 appsettings.json
    {
      "App": 
      {
        "LoginCredentials": 
        {
           "ClientId": "xxx",
           "ClientSecret": "xxx",
           "TenantId": "xxx"
        },
        "DataBase": 
        {
            "PathToDatabases": "xxx"
        },
        "General": 
        {
           "PathToLogFiles": "xxx"
        }
      }

    }
  1. 我创建了一个类 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>();
        }
    }

  1. 那么你需要一个 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; }
    }
  1. 在您的 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.JsonMicrosoft.Extensions.Configuration.Binder
【解决方案3】:

http://www.techtutorhub.com/article/how-to-read-appsettings-json-configuration-file-in-dot-net-core-console-application/83

有帮助!

  1. 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
  1. 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。

    1. 创建一个新的控制台项目。
    2. 将 appsettings.json 文件添加到项目中。
    3. 右键单击,选择属性并确保将其复制到输出目录。

    1. 编辑文件使其看起来像这样。

       {
         "ConnectionString": "Server=localhost;Database=tempDB;Uid=<dbUserName>;Pwd=<dbPassword>",
         "Smtp": {
           "Host": "smtp.gmail.com",
           "From": "Your Name"
         },
         "MySecondClass": {
           "SettingOne": "some string value",
           "SettingTwo": 82
         }
       }
      
    2. 编辑您的项目 csproj 文件以包含 Microsoft.Extensions.Configuration 包。见下文,同时注意 appsettings.json 文件。

      EXE文件 网6.0 使能够 使能够 保留最新
    3. 最后您的 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);
      

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2022-08-02
      • 2020-07-14
      • 1970-01-01
      • 2022-12-12
      • 2019-12-29
      • 2020-11-30
      • 2019-05-18
      • 2020-02-08
      相关资源
      最近更新 更多