2014-10-20 17 views
24

In früheren Versionen von ASP.NET viele von uns verwendeten Web.Debug.config/Web.Release.config Dateien trasformations behandeln, die in etwa so aussehen würde:Wie debug/release Config Transformationen in ASP.NET vNext

Web.config:

<connectionStrings> 
    <add name="AppDB" connectionString="Data Source=(LocalDb)\\..." /> 
</connectionStrings> 

Web.Release.config:

<connectionStrings> 
    <add name="AppDB" connectionString="Data Source=(ReleaseDb)\\..." xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> 
</connectionStrings> 

Gemäß ASP.NET vNext tutorial können Sie weiterhin Web.config verwenden. Aber config.json erscheinen die neue Art und Weise sein Konfigurationen jetzt zu behandeln gemäß dem gleichen Artikel:

config.json

{ 
    "Data": { 
     "DefaultConnection": { 
      "ConnectionString": "Server=(localdb)\\..." 
     } 
    } 
} 

Und in Startup.cs:

var configuration = new Configuration(); 
configuration.AddJsonFile("config.json"); 
configuration.AddEnvironmentVariables(); 

So Ich frage mich, was wäre der vorgeschlagene Weg, um Konfigurations-Transfrmation mit diesem Wechsel zu Json zu behandeln?

Antwort

20

vNext verwendet ein neues Konfigurationssystem, in dem Sie die Umgebungsvariablen über Code lesen können. In diesem Fall würden Sie prüfen, ob die entsprechende Umgebungsvariable vorhanden ist, und den entsprechenden JSON-Code einschließen.

Zum Beispiel können Sie eine qa.json und prod.json erstellen. Setzen Sie eine Umgebungsvariable, sagen wir "ENV", die in diesen jeweiligen Umgebungen auf "qa" und "prod" zeigt. Dann können Sie bedingt den passenden JSON hinzufügen.

Der Code könnte wie folgt aussehen:

1) default.json enthält alle Standard Sachen.

2) qa.json und prod.json enthalten die notwendigen Überschreibungen.

3) Da qa.json und prod.json später kommen, werden sie gewinnen. Wenn es eine „setting1“ in default.json und qa.json ist, wird es automatisch die „setting1“ in qa.json

var configuration = new Configuration() 
        .AddJsonFile("default.json") 
        .AddEnvironmentVariables(); 

var envSpecificJson = configuration.Get("ENV") + ".json"; 
configuration.AddJsonFile(envSpecificJson); 
+0

Die Reihenfolge der Vorrang ist, dass "last in wins", also mit diesem Ansatz sagen Sie "Standard auf die Werte in' default.json', überschreiben Sie diese mit allem in Umgebungsvariablen gefunden, und überschreiben Sie diese mit irgendetwas in {envSpecificJson}. " Der empfohlene Ansatz besteht darin, dass Umgebungsvariablen alle dateibasierten Konfigurationswerte überschreiben. Die Standardvorlage verwendet jetzt: .AddJsonFile ("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile ($ "appsettings. {Env.EnvironmentName} .json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); –

3

abholen Während die vorherige Antwort (en) eine gute Lösung bietet würde Ich mag

-Code

var configuration = new Configuration() 
        .AddJsonFile("config.json") 
        .AddEnvironmentVariables(); 

Lokale Umgebung: ein abwechselndes zu präsentieren Hier haben Sie die "config.json" Datei mit allen Einstellungen. Es ist leicht zu bearbeiten und zu pflegen.

Prod-Umgebung: Bei der Bereitstellung müssen Sie die Datei "config.json" auslassen. Wenn es fehlt, sucht der Code nach der nächsten Quelle in der Kette, die die Umgebungsvariablen sind. Verwenden Sie daher auf Ihrem lokalen Computer die Konfigurationsdatei. Wenn Sie auf dem Server sind, greifen Sie auf die Umgebungsvariablen zurück.Beachten Sie, dass die Konfigurationsschlüssel in der Datei und den Umgebungsvariablen natürlich identisch sein müssen.

+8

müssen Sie die 'config.json' nicht weglassen, wenn es Umgebungsvariablen gibt, überschreibt sie die auf' config.json' und dies ist der empfohlene Workflow für Dinge wie Verbindungszeichenfolge. –

2

Standardmäßig sucht ASP.NET nach einer Umgebungsvariablen namens "ASPNET_ENV", um die Umgebungsvariable "IHostingEnvironment" festzulegen.

Der entsprechende Code ist hier zu sehen:

https://github.com/aspnet/Hosting/blob/77e2dc263f11655312d4c73bb8e22d7b6254d485/src/Microsoft.AspNet.Hosting/HostingFactory.cs

Man könnte so etwas wie das folgende tun, wenn Sie ASPNET_ENV Wert auf den Servern in Ihren verschiedenen Umgebungen ändern:

var configuration = new Configuration() 
      .AddJsonFile("config.json") 
      .AddEnvironmentVariables(); 
if (string.Equals(env.EnvironmentName, "Prod", StringComparison.OrdinalIgnoreCase)) 
{ 
      configuration.AddJsonFile("prod.config.json"); 
} 
Verwandte Themen