2016-07-13 42 views
1

無法確定如何讀取startup.cs之外的appsettings.json值。我想這樣做的是,例如,在_Layout.cshtml,從配置中添加站點名稱:訪問控制器類中的appsettings.json值

例如:

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

甚至更​​好:

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

這裏是我的代碼迄今:

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

也許我讀的文檔錯誤的,但我似乎無法揭露啓動類之外的配置對象。

+0

你看到這一點:http://stackoverflow.com/questions/31453495/how-to-read- appsettings-values-from-config-json-in-asp-net-vnext –

回答

8

在你Startup.cs

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

然後在你的控制器:

public class ValuesController : Controller 
{ 
    IConfiguration configuration; 

    public ValuesController(IConfiguration configuration) 
    { 
     this.configuration = configuration; 
    } 
} 
+0

這很好。你知道一種像GlobalVars.cs這樣靜態引用的方法,所以我不必在每個控制器的頂部聲明它。 –

+1

您可以創建一個單例並從中公開Configuration屬性。確保它始終是相同的實例。然後,您可以在啓動中使用它,而不是在那裏創建新的配置實例。這將使該屬性可用於其他層。 –

+0

這實際上是濫用IConfiguration。控制器不應該關心配置中間件。它不應該要求它啓動和運行只是爲了傳遞一個設置。它是* DI *,它應該註冊並將設置注入控制器,可能是IOption <>對象的形式 –