Alcune volte nel mio passato ho voluto memorizzare i dati nel codice. Si tratta di dati che cambiano raramente e vengono utilizzati in luoghi in cui l'accesso a un database non è possibile, pratico o auspicabile. Un piccolo esempio potrebbe essere la memorizzazione di un elenco di paesi. Per quello 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);
}
}
In passato sono riuscito a farlo 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 totali.
I dati stessi cambiano molto raramente e quando cambia non è nemmeno così importante. Quindi il passaggio alla versione successiva è perfetto.
Sto pensando di utilizzare T4 o ERB o qualche altra soluzione di template per trasformare la mia fonte di dati in qualcosa che è staticamente immagazzinato nell'assembly.
Sembra che le mie opzioni siano
- Archivia i dati in XML. Compilare il file XML come risorsa di assemblaggio. Caricare i dati secondo necessità, memorizzare i dati caricati in un dizionario per prestazioni ripetute.
- Genera qualche tipo di oggetto statico o oggetti inizializzati all'avvio.
Sono abbastanza sicuro di aver compreso le implicazioni sulle prestazioni dell'opzione 1. Almeno, la mia impressione è che non avrebbe prestazioni stellari.
Per quanto riguarda l'opzione 2, non so cosa fare. Non conosco abbastanza i componenti interni del framework .NET per conoscere il modo migliore per archiviare questi dati nel codice C # e i modi migliori per inizializzarlo. Mi sono messo in giro usando .NET Reflector per vedere come funziona System.Globalization.CultureInfo.GetCulture(name)
, poiché questo è in realtà un flusso di lavoro molto simile a quello che voglio. Sfortunatamente quella traccia si è conclusa con un extern
, quindi non ci sono suggerimenti. Sta inizializzando 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 metterli 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 ho il sospetto che fare questo ha una penalizzazione delle prestazioni di avvio. Spero che qualcuno abbia esperienza con questo e possa condividere le loro opinioni!