58 votes

Comment charger appsetting.json section dans le Dictionnaire .NET de Base?

Je suis familier w/ chargement d'un appsettings.json section dans un objet fortement typé dans .NET de Base démarrage.cs. Par exemple:

public class CustomSection 
{
   public int A {get;set;}
   public int B {get;set;}
}

//In Startup.cs
services.Configure<CustomSection>(Configuration.GetSection("CustomSection"));

//Inject an IOptions instance
public HomeController(IOptions<CustomSection> options) 
{
    var settings = options.Value;
}

J'ai un appsettings.json section qui de paires clé/valeur varie en nombre et nom au fil du temps. Par conséquent, il n'est pas pratique pour coder en dur les noms de propriété dans une classe, puisque de nouvelles paires clé/valeur nécessiterait une modification du code dans la classe. Un petit échantillon de quelques paires clé/valeur:

"MobileConfigInfo": {
    "appointment-confirmed": "We've booked your appointment. See you soon!",
    "appointments-book": "New Appointment",
    "appointments-null": "We could not locate any upcoming appointments for you.",
    "availability-null": "Sorry, there are no available times on this date. Please try another."
}

Est-il un moyen de charger ces données dans un MobileConfigInfo Dictionnaire de l'objet, puis utilisez l'IOptions modèle à injecter MobileConfigInfo dans un contrôleur?

40voto

code5 Points 693

Aller avec ce format de structure:

"MobileConfigInfo": {
    "Values": {
       "appointment-confirmed": "We've booked your appointment. See you soon!",
       "appointments-book": "New Appointment",
       "appointments-null": "We could not locate any upcoming appointments for you.",
       "availability-null": "Sorry, there are no available times on this date. Please try another."
 }
}

Faire de votre réglage de classe ressembler à ceci:

public class CustomSection 
{
   public Dictionary<string, string> Values {get;set;}
}

ensuite ce faire

services.Configure<CustomSection>((settings) =>
{
     Configuration.GetSection("MobileConfigInfo").Bind(settings);
});

35voto

OHDev Points 64

Pour d'autres qui veulent convertir un Dictionnaire,

de l'échantillon à l'intérieur de la section appsettings.json

"MailSettings": {
    "Server": "http://mail.mydomain.com"        
    "Port": "25",
    "From": "info@mydomain.com"
 }

Code suivant doit être placé dans le fichier de Démarrage > ConfigureServices méthode:

public static Dictionary<string, object> MailSettings { get; private set; }

public void ConfigureServices(IServiceCollection services)
{
    //ConfigureServices code......

    MailSettings = 
        Configuration.GetSection("MailSettings").GetChildren()
        .Select(item => new KeyValuePair<string, string>(item.Key, item.Value))
        .ToDictionary(x => x.Key, x => x.Value);
}

Maintenant, vous pouvez accéder au dictionnaire à partir de n'importe où, comme:

string mailServer = Startup.MailSettings["Server"];

Un inconvénient est que toutes les valeurs seront récupérés comme des chaînes de caractères, si vous essayez de tout autre type de la valeur sera nulle.

32voto

Hung Cao Points 2149

Vous pouvez utiliser Configuration.Bind(settings); en startup.cs classe

Et vos paramètres de classe sera comme

public class AppSettings
{
    public Dictionary<string, string> MobileConfigInfo
    {
        get;
        set;
    }
}

Espérons que cela aide!

21voto

macpak Points 261

Je crois que vous pouvez utiliser le code suivant:

var config =  Configuration.GetSection("MobileConfigInfo").Get<Dictionary<string, string>>(); 

5voto

ste-fu Points 3741

Pour la simple (peut-être microservice) d'applications que vous pouvez ajouter simplement comme un singleton Dictionary<string, string> et puis à l'injecter partout où vous en avez besoin:

var mobileConfig = Configuration.GetSection("MobileConfigInfo")
                    .GetChildren().ToDictionary(x => x.Key, x => x.Value);

services.AddSingleton(mobileConfig);

Et l'utilisation:

public class MyDependantClass
{
    private readonly Dictionary<string, string> _mobileConfig;

    public MyDependantClass(Dictionary<string, string> mobileConfig)
    {
        _mobileConfig = mobileConfig;
    }

    // Use your mobile config here
}

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