it-swarm.com.de

ASP.NET Core-Konfigurationsabschnitt in Startup

Ich migriere ein ASP.NET 5 RC1-Projekt zu ASP.NET Core und bin auf ein interessantes Problem gestoßen, für das ich bisher noch nicht bekannt war oder eine Lösung gefunden habe.

Um Konfigurationseinstellungen innerhalb des Startvorgangs zu verwenden, habe ich die Konfiguration zuvor auf folgende Weise abgerufen

// Works fine for DI both in ASP.NET 5 RC1 and ASP.NET Core
services.Configure<SomeConfigurationClass>(Configuration.GetSection("SomeConfigurationSection"));

// How I previous retrieved the configuration for use in startup. 
// No longer available in ASP.NET Core
var someConfigurationToUseLater = Configuration.Get<SomeConfigurationClass>("SomeConfigurationSection");

Nach dem Update auf ASP.NET Core 1.0 scheint Configuration.Get <T> () nicht mehr verfügbar zu sein.

Ich habe versucht, den Code zu aktualisieren, um Configuration.GetValue <T> () zu verwenden. Dies scheint jedoch nicht mit Objekten zu funktionieren und funktioniert nur, wenn Sie einen Pfad zu einem Wert angeben. Dies hat mich zu einem Workaround für most meiner Konfigurationsklassen geführt

var someConfigurationName = "someConfiguration";    
var someConfigurationClass = new SomeConfigurationClass()
{
    Value1 = Configuration.GetValue<string>($"{someConfigurationName}:value1"),
    Foo = Configuration.GetValue<string>($"{someConfigurationName}:foo"),
    Bar = Configuration.GetValue<string>($"{someConfigurationName}:bar")
};

Dies ist jedoch ein Problem, wenn die Konfigurationsklasse ein Array von Objekten enthält. In meinem Fall ein Array von Client-Objekten

public class ClientConfiguration
{
    public Client[] Clients { get; set; }
}

Mit der folgenden Konfiguration

"configuredClients": {
  "clients": [
    {
      "clientName": "Client1",
      "clientId": "Client1"
    },
    {
      "clientName": "Client2",
      "clientId": "Client2"
    }
  ]
}

Wo dies zuvor an die Clients-Eigenschaft meiner Konfigurationsklasse kein Problem binden würde, kann ich in ASP.NET Core 1.0 keinen Weg mehr finden

35
Aaron Bamford

Aktualisierte Antwort
Für ASP wird die generische Modellbindung von Core 1.1.0 jetzt mit Get durchgeführt

var config = Configuration.GetSection("configuredClients").Get<ClientConfiguration>();

Ursprüngliche Antwort
Wie wäre es damit:

var config = Configuration.GetSection("configuredClients").Bind<ClientConfiguration>();
57
Tom Makin

Mit ASP.NET Core 2.0 (im Grunde genommen Core 1.1+) wird IConfiguration in Startup injiziert, und das auch Kann innerhalb der Methoden ConfigureServices() und Configure() verwendet werden.

Wie in der akzeptierten Antwort gezeigt, kann die Konfiguration an ein Objekt gebunden werden. Wenn jedoch nur ein Wert erforderlich ist, funktioniert der schlüsselbasierte Ansatz gut.

Das IConfiguration funktioniert immer noch mit durch Doppelpunkte : Getrennten Zeichenfolgenschlüsseln. Verwenden Sie für array einen 0-basierten Index. Oder verwenden Sie die generische Methode getValue<T>() mit denselben Tasten. Siehe folgendes Beispiel:

var clientId2 = Configuration["configuredClients:clients:1:clientId"]?.ToString();
var clientName1 = Configuration.GetValue<string>("configuredClients:clients:0:clientName");

So verwenden Sie dieselben Konfigurationswerte in anderen Klassen (z. B. Controllern)

  1. Fügen Sie entweder IConfiguration ein und verwenden Sie denselben schlüsselbasierten Ansatz wie oben. Oder
  2. Registrieren Sie eine Instanz des stark typisierten Konfigurationsobjekts im DI-Container und fügen Sie dieses Objekt direkt in Clientklassen ein.

Beispielcode unten:

//In Startup.ConfigureServices()
var clientConfig = Configuration.GetSection("configuredClients")
    .Get<ClientConfiguration>();
services.AddSingleton(clientConfig);

//Controller
public class TestController : Controller
{
    IConfiguration _configStore;
    ClientConfiguration _clientConfiguration;

    public TestController(IConfiguration configuration, 
        ClientConfiguration clientConfiguration)
    {
        _configStore = configuration;
        _clientConfiguration = clientConfiguration;
    }

    public IActionResult Get()
    {
        //with IConfiguration
        var clientId1 = _configStore
            .GetValue<string>("configuredClients:clients:0:clientId");

        //with strongly typed ClientConfiguration
        var clientName1 = _clientConfiguration.Clients[0]?.ClientName;

        return new OkObjectResult("Configuration test");
    }
}

Weitere Beispiele hier .

5
Arghya C

Sie lesen die Konfiguration in ASP.NET Core nicht allgemein manuell, sondern erstellen ein Objekt, das Ihrer Definition entspricht. Mehr dazu lesen Sie in der offiziellen Dokumentation hier .

Z.B.

public class MyOptions
{
    public string Option1 { get; set; }
    public int Option2 { get; set; }
}

public void ConfigureServices(IServiceCollection services)
{
    // Setup options with DI
    services.AddOptions();
    services.Configure<MyOptions>(Configuration);
}

Dann fügen Sie einfach die Optionen IOptions<MyOptions> dort ein, wo Sie sie benötigen.

2

Wenn Sie zuerst "clientName" (erwarteter "Client1") abrufen möchten, schreiben Sie einfach:

Configuration.GetSection("configuredClients")["clients:0:clientName"];

Update für Kommentar

Installieren Sie .NET Core 1.0.1 und befolgen Sie die Anweisungen von @ TomMakin.

0
adem caglin