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?
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
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>>()
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
});
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. :)