2016-07-13 19 views
1

Probleme beim Berechnen von appsettings.json-Werten außerhalb von startup.cs. Was ich möchte, ist zu tun, zum Beispiel, ist in der _Layout.cshtml, fügen Sie die Site-Namen aus der config:Zugriff auf appsettings.json-Werte in Controller-Klassen

Zum Beispiel:

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

Oder noch besser:

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

Hier ist mein Code so weit:

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

Vielleicht sind die Dokumente falsch lese ich, aber ich kann nicht scheinen, das Objekt Konfiguration außerhalb der Startup-Klasse zu belichten.

+0

Haben Sie sehen: http://stackoverflow.com/questions/31453495/how-to-read- appsettings-values-von-config-json-in-asp-net-vnext –

Antwort

8

In Ihrem Startup.cs

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

dann in Ihrem Controller:

public class ValuesController : Controller 
{ 
    IConfiguration configuration; 

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

Das funktioniert gut. Weißt du, wie man das in einer Art GlobalVars.cs statisch referenziert, also muss ich das nicht oben auf jedem Controller deklarieren? –

+1

Sie könnten ein Singleton erstellen und die Configuration-Eigenschaft daraus anzeigen. Stellen Sie sicher, dass es immer die gleiche Instanz ist. Dann können Sie es im Startup verwenden, anstatt dort eine neue Konfigurationsinstanz anzulegen. Dadurch wird die Eigenschaft anderen Layern zur Verfügung gestellt. –

+0

Das ist eigentlich ein Missbrauch von IConfiguration. Der Controller sollte sich nicht um die Konfigurations-Middleware kümmern. Es sollte nicht erforderlich sein, dass es ausgeführt wird, nur um eine einzige Einstellung zu übergeben. Es ist * DI *, das die Einstellungen registrieren und in den Controller injizieren sollte, möglicherweise in Form von IOption <> Objekten –