web-dev-qa-db-fra.com

Section de configuration ASP.NET Core au démarrage

Je migre un projet ASP.NET 5 RC1 vers ASP.NET Core et je suis tombé sur un problème intéressant que je n'ai pas encore vu, ou sur lequel j'ai trouvé une solution.

Afin d’utiliser les paramètres de configuration dans le démarrage, j’ai déjà retransmis la configuration de la manière suivante

// 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");

Après la mise à jour vers ASP.NET Core 1.0, il semble que Configuration.Get <T> () ne soit plus disponible.

J'ai essayé de mettre à jour le code pour utiliser Configuration.GetValue <T> (), mais cela ne semble pas fonctionner avec les objets et ne fonctionnera que si un chemin d'accès à une valeur est fourni. Cela m'a laissé une solution de contournement pour la plupart de mes classes de configuration comme si

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")
};

Cependant, cela pose un problème lorsque la classe de configuration contient un tableau d'objets. Dans mon cas, un tableau d'objets client

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

Avec la configuration suivante

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

Là où cela relierait auparavant la propriété Clients de ma classe de configuration, aucun problème, je ne trouve plus moyen de le faire dans ASP.NET Core 1.0

35
Aaron Bamford

Réponse mise à jour
Pour ASP Core 1.1.0, la liaison de modèle générique est maintenant effectuée à l'aide de Get:

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

Réponse originale
Que dis-tu de ça:

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

En général, vous ne lisez pas la configuration manuellement dans ASP.NET Core, vous créez plutôt un objet qui correspond à votre définition. Vous pouvez en lire plus à ce sujet dans la documentation officielle ici .

Par exemple.

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

Ensuite, vous n'injectez que les options IOptions<MyOptions> où vous en avez besoin.

2

Avec ASP.NET Core 2.0 (essentiellement Core 1.1+), la variable IConfiguration est injectée dans Startup et peut être utilisée dans les méthodes ConfigureServices() et Configure().

Comme indiqué dans la réponse acceptée, la configuration peut être liée à un objet. Mais si une seule valeur est requise, l’approche par clé fonctionne bien.

La IConfiguration fonctionne toujours avec les deux-points : séparés par des clés de chaîne. Et pour array, utilisez un index basé sur 0. Ou utilisez la méthode générique getValue<T>() avec les mêmes clés. Voir exemple ci-dessous:

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

Pour utiliser les mêmes valeurs de configuration dans d'autres classes (par exemple, des contrôleurs)

  1. Injectez la variable IConfiguration et utilisez la même approche à base de clé que ci-dessus. Ou
  2. Enregistrez une instance de l'objet de configuration fortement typé avec le conteneur DI et injectez cet objet directement dans les classes client.

Exemple de code ci-dessous:

//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");
    }
}

Plus d'exemples ici .

2
Arghya C

Si vous voulez obtenir le premier "clientName" (attendu "Client1"), écrivez simplement:

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

Mise à jour pour commentaires

Installez .NET Core 1.0.1 et suivez les instructions de @ TomMakin.

0
adem caglin