如何使用 .NET Core 从控制台应用程序中的 appsettings.json 获取值?

Jav*_*viL 6 c# startup appsettings .net-core

我正在使用 .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")
                                  
        }
Run Code Online (Sandbox Code Playgroud)

我无法制作正确的 Main 因为我不知道如何初始化所有内容...我错过了什么?我想我一直在绕圈子做这么简单的事情。提前致谢!注意:我需要从另一个库类中获取这些变量,而不是在 Main 中。我不知道如何在其他类中初始化“配置”以使用它。谢谢

Viv*_*Dev 43

要开始使用Visual Studio 2022和 .net 6,请按照以下步骤操作。如果您有 Visual Studio 2022 的最新更新(17.4.0 或更高版本),您也可以在同一行中使用 .net 7+ 创建应用程序。

如果您只想使用Visual Studio Code而不是Visual Studio 2022,请向下滚动以查看说明。

  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
       }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑项目 csproj 文件以包含Microsoft.Extensions.Configuration及其json 对应部分包。请参见下文,另请注意appsettings.json文件。

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>

      <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
        <PackageReference Include="Microsoft.Extensions.Configuration.json" Version="6.0.0" />
      </ItemGroup>

      <ItemGroup>
        <None Update="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
      </ItemGroup>

    </Project>

Run Code Online (Sandbox Code Playgroud)
  1. 最后你的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);
    
    Run Code Online (Sandbox Code Playgroud)

如果您只想使用Visual Studio Code而不是Visual Studio 2022,请执行以下操作。

  1. 为 simple-console-app 创建一个目录并 cd 进入其中。

为控制台应用程序创建一个目录

  1. 执行以下命令创建一个新的控制台应用程序。
dotnet new console
dotnet run
Run Code Online (Sandbox Code Playgroud)

创建并运行控制台应用程序

  1. 现在,通过运行以下命令在 Vs Code 中打开项目。

代码 。

在 VS Code 中打开

  1. 添加一个新文件 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
       }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑项目 csproj 文件以包含Microsoft.Extensions.Configuration及其json 对应部分包。请参见下文,另请注意appsettings.json文件。

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
      </PropertyGroup>

      <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
        <PackageReference Include="Microsoft.Extensions.Configuration.json" Version="6.0.0" />
      </ItemGroup>

      <ItemGroup>
        <None Update="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
      </ItemGroup>

    </Project>

Run Code Online (Sandbox Code Playgroud)
  1. 最后你的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);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在该跑步了。但首先执行dotnet Restore然后执行 dotnet run

dotnet restore
dotnet run
Run Code Online (Sandbox Code Playgroud)

恢复并运行

  • 你的帖子很好,除了它没有提到“Microsoft.Extensions.Configuration.Json”包,它也是读取 json 配置文件所必需的 (2认同)
  • 我也包含了 cs prof 文件 xml,但不知何故它没有出现。现在检查。 (2认同)

Rom*_*one 33

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"
  }
}
Run Code Online (Sandbox Code Playgroud)

2.需要的包

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Json
Run Code Online (Sandbox Code Playgroud)
  1. 程序.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();
            }
        }
Run Code Online (Sandbox Code Playgroud)


Fur*_*ürk 9

我已经尝试过以下方法并且效果很好。

1- 将launchSettings.json添加到项目的Properties文件夹下。
2- 将每个环境的应用程序设置文件添加到项目中。
3- 将您的appsettings文件添加到.csproj中,如下所示。
4-然后你可以通过下面的代码注入并到达IConfiguration ,根据环境读取appsettings文件。

    var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    
    var configuration =  new ConfigurationBuilder()
         .SetBasePath(Directory.GetCurrentDirectory())
         .AddJsonFile($"appsettings.{environment}.json")
         .AddEnvironmentVariables()
         .AddCommandLine(args)
         .Build();
    
    var serviceProvider = new ServiceCollection()
        .AddSingleton<IConfiguration>(configuration)
        .BuildServiceProvider();
    
    var configurationInstance = serviceProvider.GetService<IConfiguration>();
Run Code Online (Sandbox Code Playgroud)

启动设置.json

{
  "profiles": {
    "YourProject": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "DEV"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您应该将 appSettings 文件添加到 .csproj 文件中

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Autofac" Version="6.3.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.DEV.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.Production.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="appsettings.QA.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

你可以将它注射到任何地方

public class ConnectionService
{
    private readonly IConfiguration _configuration;

    public ConnectionService(IConfiguration configuration)
    {
        _configuration = configuration;
    }
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 7

您的示例混合了一些希望托管您的代码的 ASP NET Core 方法。要最低限度地解决从 JSON 配置获取选项或设置的问题,请考虑以下事项:

一个config.json文件,设置为“复制到输出目录”,以便它包含在构建中:

{
  "MyFirstClass": {
    "Option1": "some string value",
    "Option2": 42
  },
  "MySecondClass": {
    "SettingOne": "some string value",
    "SettingTwo": 42
  }
}
Run Code Online (Sandbox Code Playgroud)

以下方法将从 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*uch 5

我在 .NET Core 上遇到了同样的问题,我发现这个解决方案运行良好:

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

    }
Run Code Online (Sandbox Code Playgroud)
  1. 我创建了一个类 AppSettingsHandler.cs
    {
      "App": 
      {
        "LoginCredentials": 
        {
           "ClientId": "xxx",
           "ClientSecret": "xxx",
           "TenantId": "xxx"
        },
        "DataBase": 
        {
            "PathToDatabases": "xxx"
        },
        "General": 
        {
           "PathToLogFiles": "xxx"
        }
      }

    }
Run Code Online (Sandbox Code Playgroud)
  1. 然后你需要一个 AppSettings 的“模型”类:
    public class AppSettings
    {
        public LoginCredentialsConfiguration LoginCredentials { get; set; }
        public DatabaseConfiguration DataBase { get; set; }
        public GeneralConfiguration General { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

以及每个包含的子类的模型类,我在这里只举例说明一个:

    public class LoginCredentialsConfiguration
    {
        public string ClientId { get; set; }
        public string ClientSecret { get; set; }
        public string TenantId { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 在您的 Program.cs 类中,您现在可以从 appsettings.json 获取参数,如下所示:
            var aH = new AppSettingsHandler("appsettings.json");
            var aS = aH.GetAppSettings();
            var myPath = aS.DataBase.PathToDatabases;
Run Code Online (Sandbox Code Playgroud)

当然,您可以调整该代码以使其符合您的要求,即您必须定义自己的类和子类,当然您还可以通过获取 appsettings.json 的其他部分来扩展 AppSettingsHandler.cs。

  • 安装 nuget 包“Microsoft.Extensions.Configuration.Json”和“Microsoft.Extensions.Configuration.Binder” (3认同)