2017-10-24 3 views
0

Ich hosting eine .NET Core 2.0-Anwendung als Service mit PeterKottas.DotNetCore.WindowsService Nugget, alles funktioniert soweit gut..NET Core laden korrekte Konfigurationen basierend auf Publishing-Profil

Mein Problem ist, dass dieser Dienst mehrere Instanzen auf dem gleichen Server verschiedene Dinge auf der Grundlage von Konfigurationsdateien ausführen wird.

Warum nicht den gleichen Dienst machen beide, könnten Sie fragen. Da ich nur einen Entwicklungsserver für alle Dienste habe und es in der Produktion 1 Server pro Standort gibt, muss dieser aufgeteilt werden.

Beispiel:

  • Instanz 1 der Dienst läuft eine Datei Radiergummi für Website-US;
  • Instanz 2 des Dienstes führt einen Dateilöscher für Site-CA aus;

Instanz 1 sollte "appsettings.US.json" und Instanz 2 "appsettings.CA.json" laden. Die Umgebungsvariable "ASPNETCORE_ENVIRONMENT" ist keine Lösung, da sie global ist und beide Dienste (im Entwicklungsserver) betrifft. Im Moment habe ich dies in localy auszuführen:

string environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); 

var builder = new ConfigurationBuilder() 
    .SetBasePath(Directory.GetCurrentDirectory()) 
    .AddJsonFile("appsettings.json", false, true) 
    .AddJsonFile($"appsettings.{environmentName}.json", true, true) 
    .AddEnvironmentVariables(); 

Beiden Seiten sind auch in dem gleichen Entwicklungs-Server, aber es ist in Ordnung, weil es eine Web.config war die Variable in IIS für jede spezifische Stelle zu setzen. Ich frage mich, ob es etwas Ähnliches für Dienstleistungen gibt, denn es wäre eine großartige Lösung für mein Problem, aber ich habe meinen Kopf an die Wand geschlagen und nichts gefunden.

Andere mögliche Lösung wäre, nur die richtige Konfiguration zu veröffentlichen, dann umbenennen, so dass "appsettings.US.json" würde nur "appsettings.json" genannt werden und ich würde das nur stattdessen laden, aber alle meine Versuche an Dies ist fehlgeschlagen. Es scheint, dass es das Publishing-Profil nicht respektiert und nur das tut, was ich für die Dateieigenschaften festgelegt habe ("Copy to output" -Option).

Mache ich irgendwas falsches in den Veröffentlichungsprofilen, gibt es irgendeinen "Umgebungsvariable" serverspezifischen Typ der Sache, oder gibt es sogar irgendeine andere Lösung, an die ich mich nicht erinnere?

Antwort

0

Warum nicht einfach die command-line configuration provider verwenden? Anschließend können Sie bei der Einrichtung des Dienstes die gewünschten benutzerdefinierten Einstellungen als Startparameter festlegen.

var builder = new ConfigurationBuilder() 
    .SetBasePath(Directory.GetCurrentDirectory()) 
    .AddJsonFile("appsettings.json", false, true) 
    .AddJsonFile($"appsettings.{environmentName}.json", true, true) 
    .AddEnvironmentVariables() 
    .AddCommandLine(args); 

Ich würde Stick mit appsettings.{environment}.json verlassen zu herkömmlichen Umgebungen gewidmet, wie „Entwicklung“, „Staging“, „Production“, etc. Sie Abschnitte, um Ihre Einstellungen hinzufügen können, dann für jedes Land (?) Wie :

{ 
    ... 
    "Countries": { 
     "US": { 
      "foo": "bar" 
     }, 
     "CA": { 
      "foo": "baz" 
     } 
    } 
} 

auf diese Weise passen Sie diese Basis-Einstellungen auf die Entwicklung/Produktion, sollten Sie benötigen. Dann erstellen Klasse wie:

public class CountryConfig 
{ 
    public string Foo { get; set; } 
} 

In ConfigureServices:

var country = Configuration.Get<string>("country"); 
services.AddSingleton(Configuration.GetSection($"Countries.{country}").Get<CountryConfig>()); 

Stellen Sie die folgenden als Startparameter für den Service:

country=US 

Und dann schließlich nur injizieren CountryConfig wo du brauchst es.

+0

Das ist eigentlich eine großartige Lösung, nur zu fragen, ob es nichts config basiert. Wenn nichts auftaucht, werde ich es als akzeptiert markieren – DGaspar

+0

Anscheinend PeterKottas Nugget erlaubt derzeit diese Lösung nicht, aber bereits ein Problem auf github erstellt (https://github.com/PeterKottas/DotNetCore.WindowsService/issues/50), Bis dahin wird diese Antwort mir nicht helfen – DGaspar