A Comprehensive Guide to Reading Values from appsettings.json in .NET Core Console Applications

Dec 11, 2025 · Programming · 12 views · 7.8

Keywords: NET Core | Console Application | appsettings.json | Configuration Management | Strong-Typing Binding

Abstract: This article provides an in-depth exploration of how to read configuration values from appsettings.json files in .NET Core console applications. By analyzing common pitfalls, we demonstrate the correct setup of ConfigurationBuilder, JSON file properties, and methods for accessing configuration data through strong-typing or direct key-value access. Special emphasis is placed on configuration approaches in non-ASP.NET Core environments, along with practical techniques for accessing configurations from other class libraries, helping developers avoid common initialization errors.

Introduction

In .NET Core development, configuration management is a fundamental feature that allows developers to externalize application settings, thereby enhancing code maintainability and flexibility. However, many developers encounter difficulties when attempting to use appsettings.json in console applications, particularly when trying to access these configuration values from other class libraries. This article aims to address this issue by presenting a clear, practical approach to correctly reading and utilizing appsettings.json files in .NET Core console applications.

Analysis of Common Pitfalls

Many developers mistakenly apply ASP.NET Core configuration patterns directly to console applications, which often leads to initialization failures. In ASP.NET Core, the configuration system relies on dependency injection components such as IHostingEnvironment, which are not inherently available in simple console applications. For example, the following code snippet illustrates this mismatch:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
    Configuration = builder.Build();
}

Here, IHostingEnvironment is typically unavailable in console applications, necessitating a more direct approach.

Correct Configuration Setup

To properly configure a console application, we first need to add the necessary NuGet packages. Using the Package Manager Console or dotnet CLI, install the following packages:

Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.Json

Next, ensure that the appsettings.json file is correctly set up. In Visual Studio, right-click the file, select Properties, and set "Copy to Output Directory" to "Copy always" or "Copy if newer." This ensures the file is copied to the output directory after building, making it available at runtime. An example appsettings.json file content is as follows:

{
  "MyFirstClass": {
    "Option1": "some string value",
    "Option2": 42
  },
  "MySecondClass": {
    "SettingOne": "some string value",
    "SettingTwo": 42
  }
}

In Program.cs, we can use ConfigurationBuilder to load the configuration. The key point is to use Directory.GetCurrentDirectory() to set the base path, rather than relying on IHostingEnvironment:

using System;
using System.IO;
using Microsoft.Extensions.Configuration;

class Program
{
    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false);

        IConfiguration config = builder.Build();
    }
}

Accessing Configuration Values

Once the configuration is built, we can access values in multiple ways. The simplest method is key-value access, for example:

var option2 = config["MyFirstClass:Option2"];
Console.WriteLine($"Option2 value: {option2}");

However, a more recommended approach is strong-typing binding, which improves code readability and type safety. First, define classes that match the JSON structure:

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; }
}

Then, bind the configuration in the Main method:

var myFirstClass = config.GetSection("MyFirstClass").Get<MyFirstClass>();
var mySecondClass = config.GetSection("MySecondClass").Get<MySecondClass>();
Console.WriteLine($"The answer is always {myFirstClass.Option2}");

Accessing Configuration from Other Class Libraries

To access configuration from other class libraries (such as the Extractor class in the question), we need to pass the IConfiguration instance into these classes. This can be achieved through dependency injection or direct passing. Here is an example:

public class Extractor
{
    private readonly IConfiguration _configuration;

    public Extractor(IConfiguration configuration)
    {
        _configuration = configuration;
        Init();
    }

    private void Init()
    {
        int min = _configuration.GetValue<int>("Extractor:Min");
        Console.WriteLine($"Min value: {min}");
    }
}

In the Main method, we can use it as follows:

var extractor = new Extractor(config);

This approach ensures that configuration is accessible throughout the application while maintaining modularity and testability.

Additional Tips

Based on supplementary answers, we can also use more concise configuration methods. For example, in .NET 6 and above, top-level statements can simplify the code:

using Microsoft.Extensions.Configuration;

var builder = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

var config = builder.Build();
var connectionString = config["ConnectionString"];
Console.WriteLine($"Connection String: {connectionString}");

Additionally, ensure that the necessary package references and file settings are included in the .csproj file:

<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>

Conclusion

Reading configuration values from appsettings.json in .NET Core console applications is not complex, but it requires avoiding the misuse of ASP.NET Core-specific patterns. By correctly setting file properties, using ConfigurationBuilder to load JSON files, and combining strong-typing binding or key-value access, developers can easily manage configurations. When accessing configuration from other class libraries, passing the IConfiguration instance ensures global availability. The methods presented in this article are based on best practices, helping developers build more robust and maintainable console applications.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.