2017-06-23 12 views
3

Wie übergeben Sie Daten in startup.cs? DieseÜbergeben Sie Daten an startup.cs

ist für die Prüfung Integration mit WebHostBuilder und TestServer

Ich muss verschiedene Daten übergeben, je nach dem Testadapter. Also nicht wollen, ziehen Sie es in einer Konfigurationsdatei, zum Beispiel

Die Daten werden an einen registrierten Middleware in startup.cs geliefert werden

Docs scheinen dies vorschlagen sollte funktionieren:

var configBuilder = new ConfigurationBuilder() 
       .AddInMemoryCollection(new[] 
       { 
        new KeyValuePair<string, string>("key", "value"), 
       }); 

      var configuration = configBuilder.Build(); 

      var host = new WebHostBuilder() 
       .UseKestrel() 
       .UseContentRoot(Directory.GetCurrentDirectory()) 
       .UseIISIntegration() 
       .UseConfiguration(configuration) // config added here 
       .UseStartup<Startup>() 
       .Build(); 

      host.Run(); 

aber wenn ich das Configuration-Objekt in startup.cs inspiziere, ist der Schlüssel nicht vorhanden. Und nur die in startup.cs definierten Provider sind verfügbar.

ich dies versuche zur Zeit in Program.cs zu tun, um das Konzept zu testen, wird dann später zu Integrationstests bewegen

irgendwelche Ideen, was mache ich falsch?

Gibt es eine bessere Möglichkeit, Daten in den Startup zu übergeben?

+0

Die Konfiguration in 'Main' und' Startup' ist völlig anders, sie sprechen nicht miteinander. Was auch immer Sie hier einstellen, ist nur für den Web-Host-Setup. Aber wie man Daten an das 'Startup' sendet, ist eine andere Sache. Willst du es im Konstruktor oder 'Configure' oder anderswo? –

+0

Ich brauche es in Configure, wenn ich eine bestimmte Middleware, aber der Konstruktor wäre auch in Ordnung – ChrisCa

+0

Sie können einen 'Service' für die Abhängigkeitsinjektion in der' Main' tatsächlich hinzufügen, vielleicht würde das funktionieren? Ich kann ein Beispiel als Antwort hinzufügen, wenn das passend wäre. Es könnte beispielsweise ein Singleton mit den gewünschten Daten sein. –

Antwort

1

Eine Möglichkeit, Daten an die Startup zu senden, wäre die Registrierung eines Dienstes in Main. WebHostBuilder hat ConfigureServices Methode, die genau wie die ConfigureServices Methode verwendet werden kann, die Sie in der Startup Klasse implementieren können.

Zum Beispiel können Sie eine Klasse mit statischen Variablen machen kann (nicht die beste Idee, aber funktioniert)

public class DataContainer 
{ 
    public static string Test; 
} 

Dann seine Werte festgelegt und es als Dienst Singletons hinzufügen

DataContainer.Test = "testing"; 

var host = new WebHostBuilder() 
      .ConfigureServices(s => { s.AddSingleton(typeof(DataContainer)); }) 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseConfiguration(configuration) // config added here 
      .UseStartup<Startup>() 
      .Build(); 

Danach wird Ihr Startup kann einfach die normale Injektionsmethode verwenden, um diese

public Startup(IHostingEnvironment env, DataContainer data) 
{ 
    // data.Test is available here and has the value that has been set in Main 
} 

zu erhalten Die Injektion funktioniert natürlich in jeder Klasse und Methode, nicht nur im Konstruktor.

Ich bin nicht sicher, ob das ist besser als tatsächlich eine Klasse mit statischen Werten selbst zu erstellen, aber wenn die Klasse geändert werden muss, kann es manchmal in eine Schnittstelle und die anderen üblichen Injektion Vorteile gemacht werden.

+0

danke - das funktioniert. nur um zu bemerken, Ihre Klasse hat keine statischen Eigenschaften, also habe ich gerade eine Instanz neu erstellt - DataContainer container = new DataContainer {Test = "testing"}; - und dann ging es so: .ConfigureServices (s => {s.AddSingleton (container);}) – ChrisCa

+0

@ChrisCa Ups, vergaß das. Aber ja, das funktioniert auch und ist besser als Statik. –

+0

Nochmals vielen Dank - lassen Sie dies für eine Weile offen, um zu sehen, ob es andere Möglichkeiten gibt, dies zu tun, aber wird diese Antwort akzeptieren, wenn nicht - Prost – ChrisCa

Verwandte Themen