Quelques fois dans mon passé, j'ai voulu stocker des données dans du code. Ce sont des données qui changent rarement et qui sont utilisées dans des endroits où l'accès à une base de données n'est pas possible, pratique ou souhaitable. Un petit exemple serait de stocker une liste de pays. Pour cela, vous pouvez faire quelque chose comme:
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);
}
}
Je m'en suis éloigné dans le passé parce que les ensembles de données étaient relativement petits et les objets assez simples. Maintenant, je travaille avec quelque chose qui aura des objets plus complexes (5 à 10 propriétés chacun, certaines propriétés étant des dictionnaires) et environ 200 objets au total.
Les données elles-mêmes changent très rarement et quand elles changent, ce n'est vraiment même pas si important. Donc, le rouler dans la prochaine version est parfaitement bien.
Je prévois d'utiliser T4 ou ERB ou une autre solution de modélisation pour transformer ma source de données en quelque chose qui est stocké statiquement dans l'assembly.
Il semble que mes options soient
- Stockez les données en XML. Compilez le fichier XML en tant que ressource d'assembly. Chargez les données selon vos besoins, stockez les données chargées dans un dictionnaire pour des performances de réutilisation.
- Générez une sorte d'objet statique ou des objets qui sont initialisés au démarrage.
Je suis à peu près sûr de comprendre les implications de l'option 1 pour les performances. Au moins, mon intuition est qu'elle n'aurait pas de performances exceptionnelles.
Quant à l'option 2, je ne sais pas quoi faire. Je ne connais pas suffisamment les éléments internes du framework .NET pour connaître la meilleure façon de stocker réellement ces données en code C # et les meilleures façons de les initialiser. J'ai fouillé en utilisant le réflecteur .NET pour voir comment cela System.Globalization.CultureInfo.GetCulture(name)
fonctionne, car il s'agit en fait d'un flux de travail très similaire à ce que je veux. Malheureusement, ce sentier s'est terminé à un extern
, donc aucun indice là-bas. L'initialisation d'une propriété statique avec toutes les données, comme dans mon exemple, est-elle la voie à suivre? Ou serait-il préférable de créer les objets à la demande, puis de les mettre en cache, comme ceci?
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();
}
L'avantage de les créer à la fois dans un membre statique est que vous pouvez utiliser LINQ ou quoi que ce soit d'autre pour regarder tous les objets et les interroger si vous le souhaitez. Bien que je soupçonne que cela ait une pénalité de performance au démarrage. J'espère que quelqu'un a de l'expérience avec cela et peut partager ses opinions!