Alcune volte in passato ho voluto archiviare i dati nel codice. Si tratta di dati che raramente cambiano e vengono utilizzati in luoghi in cui l'accesso a un database non è possibile, pratico o desiderabile. Un piccolo esempio potrebbe essere la memorizzazione di un elenco di paesi. Per questo potresti fare qualcosa del tipo:
public class Country
{
public string Code { get; set; }
public string EnglishName {get;set;}
}
public static class CountryHelper
{
public static List<Country> Countries = new List<Country>
{
new Country {Code = "AU", EnglishName = "Australia"},
...
new Country {Code = "SE", EnglishName = "Sweden"},
...
};
public static Country GetByCode(string code)
{
return Countries.Single(c => c.Code == code);
}
}
L'ho fatto in passato perché i set di dati erano relativamente piccoli e gli oggetti piuttosto semplici. Ora sto lavorando con qualcosa che avrà oggetti più complessi (5-10 proprietà ciascuno, alcune proprietà sono dizionari) e circa 200 oggetti in totale.
I dati stessi cambiano molto raramente e quando cambiano non è nemmeno così importante. Quindi inserirlo nella prossima versione di rilascio va benissimo.
Sto pianificando di utilizzare T4 o ERB o qualche altra soluzione di template per trasformare la mia fonte di dati in qualcosa che viene archiviato staticamente nell'assembly.
Sembra che le mie opzioni lo siano
- Archivia i dati in XML. Compilare il file XML come risorsa di assembly. Caricare i dati secondo necessità, archiviare i dati caricati in un dizionario per prestazioni di uso ripetuto.
- Genera qualche tipo di oggetto statico o oggetti inizializzati all'avvio.
Sono abbastanza sicuro di comprendere le implicazioni delle prestazioni dell'opzione 1. Almeno, il mio sospetto è che non avrebbe prestazioni stellari.
Per quanto riguarda l'opzione 2, non so cosa fare. Non conosco abbastanza gli interni del framework .NET per conoscere il modo migliore per archiviare effettivamente questi dati nel codice C # e i modi migliori per inizializzarli. Ho cercato con .NET reflector per vedere come System.Globalization.CultureInfo.GetCulture(name)
funziona, dato che in realtà si tratta di un flusso di lavoro molto simile a quello che voglio. Sfortunatamente quella pista finì ad un extern
, quindi nessun suggerimento lì. L'inizializzazione di una proprietà statica con tutti i dati, come nel mio esempio, è la strada da percorrere? O sarebbe meglio creare gli oggetti su richiesta e poi memorizzarli nella cache, in questo modo?
private static readonly Dictionary<string, Country> Cache = new Dictionary<string,Country>();
public static Country GetByCode(string code)
{
if (!Cache.ContainsKey(code))
return Cache[code];
return (Cache[code] = CreateCountry(code));
}
internal static Country CreateCountry(string code)
{
if (code == "AU")
return new Country {Code = "AU", EnglishName = "Australia"};
...
if (code == "SE")
return new Country {Code = "SE", EnglishName = "Sweden"};
...
throw new CountryNotFoundException();
}
Il vantaggio di crearli contemporaneamente in un membro statico è che puoi usare LINQ o qualsiasi altra cosa per guardare tutti gli oggetti e interrogarli se vuoi. Anche se sospetto che ciò comporti una penalità per le prestazioni all'avvio. Spero che qualcuno abbia esperienza con questo e possa condividere le loro opinioni!