web-dev-qa-db-fra.com

Comment extraire une liste de appsettings.json dans .net core

J'ai un fichier appsettings.json qui ressemble à ceci:

{
    "someSetting": {
        "subSettings": [
            "one",
            "two",
            "three"
         ]
    }
}

Quand je construis ma racine de configuration et que je fais quelque chose comme config["someSetting:subSettings"] _ renvoie null et les paramètres réels disponibles ressemblent à ceci:

config["someSettings:subSettings:0"]

Existe-t-il un meilleur moyen de récupérer le contenu de someSettings:subSettings comme une liste?

43
devlife

Vous pouvez utiliser le classeur de configuration pour obtenir une représentation de type fort des sources de configuration.

C’est un exemple tiré d’un test que j’ai déjà écrit, espérons que cela aidera:

    [Fact]
    public void BindList()
    {
        var input = new Dictionary<string, string>
        {
            {"StringList:0", "val0"},
            {"StringList:1", "val1"},
            {"StringList:2", "val2"},
            {"StringList:x", "valx"}
        };

        var configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddInMemoryCollection(input);
        var config = configurationBuilder.Build();

        var list = new List<string>();
        config.GetSection("StringList").Bind(list);

        Assert.Equal(4, list.Count);

        Assert.Equal("val0", list[0]);
        Assert.Equal("val1", list[1]);
        Assert.Equal("val2", list[2]);
        Assert.Equal("valx", list[3]);
    }

La partie importante est l'appel à Bind.

Le test et d'autres exemples sont sur GitHub

28
Victor Hurdugaci

En supposant que votre appsettings.json ressemble à ça:

{
  "foo": {
    "bar": [
      "1",
      "2",
      "3"
    ]
  }
}

Vous pouvez extraire les éléments de la liste de la manière suivante:

Configuration.GetSection("foo:bar").Get<List<string>>()
90
Kirill Rakhman

Voici ce que j'ai fait dans .NetCore:

Dans votre appsettings.json, créez une section de configuration pour vos définitions personnalisées:

"Definitions": {
  "Defined": [
    {
      "Name": "somename",
      "Title": "sometitle",
      "Image": "some image url"
    },
    {
      "Name": "anothername",
      "Title": "anothertitle",
      "Image": "another image url"
    }
  ]
}

Créez une classe pour modéliser les objets:

public class Defined
{
    public string Name { get; set; }
    public string Title { get; set; }
    public string Image { get; set; }
}

dans votre démarrage -> ConfigureServices

services.Configure<List<Defined>>(Configuration.GetSection("Definitions:Defined"));

Ensuite, dans votre contrôleur, quelque chose comme ceci:

Public class AccountController: Controller
{
    private readonly IOptions<List<Defined>> _customClients;
    public AccountController(IOptions<List<Defined>> customClients)
    {
        _customClient = customClients;
    }
  ...
}

juste comme exemple je l'ai utilisé ailleurs dans le contrôleur ci-dessus comme ceci:

       _customClients.Value.ForEach(x => {
            // do something with x
        });
3
Helzgate
var settingsSection = config.GetSection["someSettings:subSettings"];
var subSettings = new List<string>;

foreach (var section in settingsSection.GetChildren())
{
    subSettings.Add(section.Value);
}

Cela devrait vous donner les valeurs dont vous avez besoin, stockées dans subSettings

Toutes mes excuses pour avoir soulevé un fil semi-ancien. J'ai eu du mal à trouver une réponse car de nombreuses méthodes sont déconseillées, comme Get et GetValue. Cela devrait suffire si vous n'avez besoin que d'une solution simple sans le classeur de configuration. :)

1
Marc S