48 votes

ASP.NET de Base à la Section de Configuration de Démarrage

Je suis à la migration d'un ASP.NET 5 RC1 projet de ASP.NET de Base, et ont rencontré un problème intéressant, je n'ai pas encore vu, ou trouvé une solution pour.

Afin d'utiliser les paramètres de configuration de Démarrage, je l'ai déjà récupéré la configuration de la façon 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 de ASP.NET Core 1.0, il semble Configuration.Get<T>() n'est plus disponible.

J'ai essayé de mettre à jour le code pour utiliser la Configuration.GetValue<T>() cependant, cela ne semble pas fonctionner avec des objets et ne fonctionne que lorsque l'offre d'une voie à une valeur. Cela m'a laissé avec une solution de contournement pour la plupart de mes classes de configuration comme

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, c'est un problème lors de la configuration de la classe 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"
    }
  ]
}

Si cela peut déjà se lier à la propriété Clients de ma classe de configuration, pas de problème, je n'arrive plus à trouver un moyen de le faire dans ASP.NET Core 1.0

78voto

shakinfree Points 548

Mise À Jour De Réponse
ASP Base 1.1.0 du modèle générique de la liaison se fait maintenant à l'aide de Get:

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

Réponse Originale À Cette Question
Comment à ce sujet:

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

8voto

Arghya C Points 1381

Avec ASP.NET Core 2.0 (essentiellement Core 1.1+), l' IConfiguration est injecté Startup, et qui peut être utilisé dans ConfigureServices() et Configure() méthodes.

Comme indiqué dans l'acceptation de réponse, la configuration peut être lié à un objet. Mais si une valeur est requise, la clé de base de l'approche fonctionne bien.

L' IConfiguration travaille toujours avec le côlon : chaîne séparée par des touches. Et pour array0-index de base. Ou utilisez le générique getValue<T>() méthode avec les mêmes touches. Voir l'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, les Contrôleurs)

  1. Soit d'injecter de l' IConfiguration et l'utilisation de la même clé de l'approche fondée sur comme ci-dessus. Ou
  2. L'inscription d'une instance de fortement typées configuration de l'objet avec le conteneur d'injection de dépendances, et d'injecter de l'objet directement dans les classes.

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

D'autres exemples ici.

2voto

Ilya Chernomordik Points 419

Vous n'avez pas lu la configuration manuellement généralement dans ASP.NET de Base vous-même, au lieu de créer un objet qui correspond à votre définition. Vous pouvez en lire plus à ce sujet dans la documentation officielle ici.

E. g.

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 avez juste injecter les options IOptions<MyOptions> où vous en avez besoin.

0voto

adem caglin Points 9337

Si vous voulez obtenir d'abord "clientName"(prévu "Client1"), il suffit d'écrire:

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

Mise à jour pour le commentaire

Installer .NET de Base 1.0.1 et aller avec @TomMakin du chemin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X