Search code examples
c#.net-corestartupappsettings

How to get values from appsettings.json in a console application using .NET Core?


i'm creating a console application using .NET Core 3.1 and i would like to have an appsettings json to load all environment, paths, variables,... at the beginning of the execution, and then get values from other library classes. I have created a 'Settings' class with the data included in the appsettings json. This is what i have already by looking out in tutorials but i'm not able to get any value.

//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")
                                  
        }

I cannot make a proper Main as i don't know how to initialize everything...what am i missing? I think i've been going in circles for something that easy. Thanks in advance! NOTE: i need to get those variables from another library class, not in Main. I don't know how to initialize 'configuration' in other classes in order to use it. Thanks


Solution

  • Your example is mixing in some ASP NET Core approaches that expect your code to be hosted. To minimally solve the issue of getting options or settings from a JSON configuration, consider the following:

    A config.json file, set to "Copy to Output Directory" so that it is included with the build:

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

    The following approach will load the content from the JSON file, then bind the content to two strongly-typed options/settings classes, which can be a lot cleaner than going value-by-value:

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