24

Having trouble figuring out how to read appsettings.json values outside of the startup.cs. What I would like to do is, for instance, is in the _Layout.cshtml, add the site name from the config:

For example:

ViewData["SiteName"] = Configuration.GetValue<string>("SiteSettings:SiteName");

Or even better:

public class GlobalVars {
    public static string SiteName => Configuration.GetValue<string>("SiteSettings:SiteName");
}

Here's my code thus far:

[appsettings.json]

"SiteSettings": {
    "SiteName": "MySiteName"
}

[startup.cs]

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

    var siteName = Configuration.GetValue<string>("SiteSettings:SiteName");
}

public IConfigurationRoot Configuration { get; }

Maybe I'm reading the docs wrong, but I can't seem to expose the Configuration object outside of the Startup class.

Andy Evans
  • 6,997
  • 18
  • 72
  • 118
  • Did you see this: http://stackoverflow.com/questions/31453495/how-to-read-appsettings-values-from-config-json-in-asp-net-vnext – Matt M Jul 13 '16 at 18:44

1 Answers1

54

In your Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IConfiguration>(Configuration);
    }

then in your controller:

public class ValuesController : Controller
{
    IConfiguration configuration;

    public ValuesController(IConfiguration configuration)
    {
        this.configuration = configuration;
    }
}
  • That works well. Do you know of a way of referencing that statically in something like a GlobalVars.cs so I don't have to declare this at the top of each controller? – Andy Evans Jul 13 '16 at 19:13
  • 1
    You could create a singleton and expose the Configuration property from it. Make sure it's always the same instance. Then you can use it in the Startup instead of creating a new Configuration instance there. This will make the Property available to others layers. – Gabriel Ferrarini Jul 13 '16 at 20:48
  • 4
    That's actually an abuse of IConfiguration. The controller shouldn't care about the configuration middleware. It shouldn't require it to be up and running just to pass a single setting. It's *DI* that should register and inject the settings to the controller, perhaps in the form of IOption<> objects – Panagiotis Kanavos Feb 23 '18 at 13:33