Einige Male in meiner Vergangenheit wollte ich Daten in Code speichern. Dies sind Daten, die sich selten ändern und an Orten verwendet werden, an denen der Zugriff auf eine Datenbank nicht möglich, praktisch oder wünschenswert ist. Ein kleines Beispiel wäre das Speichern einer Liste von Ländern. Dafür könnten Sie etwas tun wie:
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);
}
}
Ich bin in der Vergangenheit damit durchgekommen, weil die Datensätze relativ klein und die Objekte ziemlich einfach waren. Jetzt arbeite ich mit etwas, das komplexere Objekte (5 - 10 Eigenschaften, wobei einige Eigenschaften Wörterbücher sind) und insgesamt etwa 200 Objekte haben wird.
Die Daten selbst ändern sich sehr selten, und wenn sie sich ändern, ist das nicht einmal so wichtig. Es ist also vollkommen in Ordnung, es in die nächste Release-Version zu rollen.
Ich plane, T4 oder ERB oder eine andere Vorlagenlösung zu verwenden, um meine Datenquelle in etwas zu verwandeln, das statisch in der Assembly gespeichert ist.
Es scheint, dass meine Optionen sind
- Speichern Sie die Daten in XML. Kompilieren Sie die XML-Datei als Assemblyressource. Laden Sie Daten nach Bedarf, speichern Sie geladene Daten in einem Wörterbuch, um die Leistung bei wiederholter Verwendung zu verbessern.
- Generieren Sie eine Art statisches Objekt oder Objekte, die beim Start initialisiert werden.
Ich bin mir ziemlich sicher, dass ich die Auswirkungen von Option 1 auf die Leistung verstehe. Zumindest ist meine Vermutung, dass es keine herausragende Leistung haben würde.
Was Option 2 betrifft, weiß ich nicht, was ich tun soll. Ich weiß nicht genug über die Interna des .NET Frameworks, um zu wissen, wie diese Daten am besten in C # -Code gespeichert und am besten initialisiert werden können. Ich habe mich mit .NET Reflector umgesehen, um zu sehen, wie das System.Globalization.CultureInfo.GetCulture(name)
funktioniert, da dies eigentlich ein sehr ähnlicher Workflow ist, wie ich es möchte. Leider endete dieser Trail an einem extern
, also keine Hinweise da. Ist das Initialisieren einer statischen Eigenschaft mit allen Daten, wie in meinem Beispiel, der richtige Weg? Oder ist es besser, die Objekte nach Bedarf zu erstellen und sie dann so zwischenzuspeichern?
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();
}
Der Vorteil beim gleichzeitigen Erstellen in einem statischen Member besteht darin, dass Sie LINQ oder was auch immer verwenden können, um alle Objekte zu betrachten und sie abzufragen, wenn Sie möchten. Obwohl ich vermute, dass dies einen Leistungsabfall beim Start zur Folge hat. Ich hoffe, jemand hat Erfahrung damit und kann seine Meinung mitteilen!