简体   繁体   中英

Read a value from appsettings.json in 1.0.0-rc1-final

In one of my concrete class. I have the method.

public class Call : ICall
{
    ......
    public  Task<HttpResponseMessage> GetHttpResponseMessageFromDeviceAndDataService()
    {
        var client = new HttpClient();
        var uri = new Uri("http://localhost:30151");
        var response =  GetAsyncHttpResponseMessage(client, uri);
        return response;
    }

Now I put the url into appsettings.json.

{
    "AppSettings": {
       "uri": "http://localhost:30151"
    }
 }

And I created a Startup.cs

 public class Startup
{
    public IConfiguration Configuration { get; set; }
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
    }
}

and now I get stuck.

EDIT

By the way, I don't have a controller, it is a console application.

Create a static class

public static class AppSettings
{
    public static IConfiguration Configuration { get; set; }

    public static T Get<T>(string key)
    {
        if (Configuration == null)
        {
            var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
            var configuration = builder.Build();
            Configuration = configuration.GetSection("AppSettings");
        }

        return (T)Convert.ChangeType(Configuration[key], typeof(T));
    }
}

then access the settings anywhere you want like

var uri = AppSettings.Get<string>("uri"); 
var rooms = AppSettings.Get<int>("noRooms");

appsettings.json example

{
    "AppSettings": {
        "uri": "http://localhost:30151",
        "noRooms":  100
    }
}

The preferred way to read configuration from appSettings.json is using dependency injection and the built or (or 3rd party) IoC container. All you need is to pass the configuration section to the Configure method.

public class AppSettings
{
    public int NoRooms { get; set; }
    public string Uri { get; set; }
}

services.Configure<AppSettings>(Configuration.GetSection("appsettings"));

This way you don't have to manually set the values or initialize the AppSettings class.

And use it in your service:

public class Call : ICall
{
    private readonly AppSettings appSettings;

    public Call(IOptions<AppSettings> appSettings) 
    {
        this.appSettings = appSetings.Value;
    }

    public Task<HttpResponseMessage>GetHttpResponseMessageFromDeviceAndDataService()
    {
        var client = new HttpClient();
        var uri = new Uri(appSettings.Uri);
        var response =  GetAsyncHttpResponseMessage(client, uri);
        return response;
    }
}

The IoC Container can also be used in a console application, you just got to bootstrap it yourself. The ServiceCollection class has no dependencies and can be instantiated normally and when you are done configuring, convert it to an IServiceProvider and resolve your main class with it and it would resolve all other dependencies.

public class Program
{
    public static void Main(string[] args) 
    {
        var configurationBuilder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json");
        var configuration = configurationBuilder.Build()
            .ReloadOnChanged("appsettings.json");

        var services = new ServiceCollection();
        services.Configure<AppSettings>(configuration.GetSection("appsettings"));
        services.AddTransient<ICall, Call>();
        // add other services

        // after configuring, build the IoC container
        IServiceProvider provider = services.BuildServiceProvider();

        Program program = provider.GetService<Program>();

        // run the application, in a console application we got to wait synchronously
        program.Wait();
    }

    private readonly ICall callService;
    // your programs main entry point
    public Program(ICall callService) 
    {
        this.callService = callService;
    }

    public async Task Run()
    {
         HttpResponseMessage result = await call.GetHttpResponseMessageFromDeviceAndDataService();

         // do something with the result
    } 
}

You can access data from the IConfigurationRoot as following:

Configuration["AppSettings:uri"]

Like suggested in the comment I would put the information in a seperate class for that info and pass it into the DI container.

the class

public class AppSettings {
    public string Uri { get; set; }
}

DI

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<AppSettings>(new AppSettings() { Uri = Configuration["AppSettings:uri"] });
    // ...
}

Controller

public class DemoController
{
    public HomeController(IOptions<AppSettings> settings) 
    {
       //do something with it
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM