2015-05-20 7 views
5

Stavo seguendo alcuni examples for ASP.NET 5 e mi sono imbattuto in come leggere correttamente i valori di configurazione "annidati" (se questo è il termine corretto).Come leggere correttamente i valori di configurazione nidificati da config.json in ASP.NET5?

Qui è rilevante porzione del config.json:

{ 
    "ApplicationName" : "OwNextApp", 
    "AppSettings": { 
     "SiteTitle": "OwNext" 
    }, 
} 

e rilevante porzione del HomeController.cs:

public IActionResult About() 
{ 
    var appNestedNameFailed = _config.Get("AppSettings.SiteTitle"); 
    var appNestedNameSuccess = _config.Get("AppSettings:SiteTitle"); 
    var appName = _config.Get("ApplicationName"); 
    ViewBag.Message = string.Format(@"Your 
     APP NAME: {0}; 
     APP NESTED NAME FAILED: {1}; 
     APP NESTED NAME SUCCESS: {2}", 
      appName, appNestedNameFailed, appNestedNameSuccess); 

    return View(); 
} 

Rapporto appNestedNameFailed è vuoto (la mia prova iniziale prima di ricerca). E appNestedNameSuccess ha valore; dopo che ho fatto ricerca e trovato nei test per Configuration (codice rilevante mostrata):

// Assert 
Assert.Equal("IniValue1", config.Get("IniKey1")); 
Assert.Equal("IniValue2", config.Get("IniKey2:IniKey3")); 

qualcuno può spiegare perché è questo il caso? Perché avrebbe senso usare : su .? Dalla mia interazione con i dati JSON di solito la notazione . funziona bene, ad es. How to access nested json data.

Inoltre, ho trovato lo stesso SO question ma ciò non spiega perché sia ​​stato scelto :.

risposta

7

Questa è la convenzione che abbiamo deciso quando abbiamo creato il modello di configurazione. Abbiamo iniziato con Json in mente e : è il delimitatore lì.

In ogni caso, se non si desidera preoccuparsi di tali convenzioni, si consiglia di utilizzare lo ConfigurationBinder che associa una configurazione a un modello (un oggetto di tipo avanzato). Here sono i test che possono servire come esempio.

+0

Quindi, come sospetto, era solo il delimitatore naturale. Grazie per aver confermato :) –

+0

Grazie a tutti. Mi piace fortemente digitato quindi uso 'ConfigurationBinder'. – CrnaStena

+0

fyi, i collegamenti sono morti – RSid

1

Scrutando in profondità nelle viscere della sorgente JsonConfigurationFileParser con colpa su per le entrare/uscire metodi che guardano:

private void VisitJObject(JObject jObject) 
{ 
    foreach (var property in jObject.Properties()) 
    { 
     EnterContext(property.Name); 
     VisitProperty(property); 
     ExitContext(); 
    } 
} 

private void EnterContext(string context) 
{ 
    _context.Push(context); 
    _currentPath = string.Join(":", _context.Reverse()); 
} 

private void ExitContext() 
{ 
    _context.Pop(); 
    _currentPath = string.Join(":", _context.Reverse()); 
} 

sembra che il team di ASP.NET dovrebbe lasciare più illuminante del check-in commenti:).

La mia ipotesi migliore è che potrebbero esistere dati memorizzati nel file config.json che avrebbero bisogno di avere un . al suo interno, mentre : sarebbe meno comune. Per esempio:

"AppSettings": { 
    "Site.Title": "Is .NET getting faster?" 
}, 

E 'un cattivo esempio, ma sembra ragionevole che volevano essere come "sicuri", come possibile e usare qualcosa al di fuori della norma. Se si desidera memorizzare il nome completo di un tipo, ciò sarebbe anche leggermente più semplice senza doversi preoccupare di un periodo di randagismo.

"AppSettings": { 
    "ImportantTypeName": "WebApp.CoolStuff.Helpers.AwesomeClass" 
}, 
+0

Sembra ragionevole, ed è quello che pensavo anch'io. Ma, speravo in qualcosa di più illuminante. Grazie per aver esaminato questo. – CrnaStena

+0

Guardando più a questo config.json, penso che abbiano scelto ':' perché è usato per annidare i dati, ad es. "AppSettings": {'. Comunque. – CrnaStena

+0

È tipico di annidare gli oggetti in json con ':' poiché denota una coppia chiave/valore. Di conseguenza, probabilmente è diventato il delimitatore più naturale. Mi spiace di non aver trovato una risposta più ufficiale per te :). –

Problemi correlati