Geçmişimde birkaç kez verileri kodda saklamak istedim. Bu, nadiren değişen ve bir veritabanına erişimin mümkün olmadığı, pratik veya istenildiği yerlerde kullanılan veriler olacaktır. Küçük bir örnek, ülkelerin bir listesini saklamak olabilir. Bunun için şöyle bir şey yapabilirsiniz:
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);
}
}
Bunu geçmişte yapmaktan kaçtım çünkü veri setleri nispeten küçüktü ve nesneler oldukça basitti. Şimdi daha karmaşık nesneler (her biri 5-10 özellik, bazı özellikler sözlükler) ve toplam yaklaşık 200 nesne olacak bir şey ile çalışıyorum.
Verilerin kendisi çok nadiren değişir ve değiştiğinde o kadar da önemli değildir. Yani bir sonraki sürümüne yuvarlamak gayet iyi.
Veri kaynağımı montajda statik olarak depolanan bir şeye dönüştürmek için T4 veya ERB veya başka bir geçici çözüm kullanmayı planlıyorum.
Görünüşe göre seçeneklerim
- Verileri XML'de saklayın. XML dosyasını bir montaj kaynağı olarak derleyin. Gerektiği gibi veri yükleyin, tekrarlanan performans için yüklenen verileri sözlüğe kaydedin.
- Başlangıçta başlatılan bir tür statik nesne veya nesne oluşturun.
Seçenek 1'in performans sonuçlarını anladığımdan eminim. En azından önsezim, yıldız performansının olmayacağı.
Seçenek 2'ye gelince, ne yapacağımı bilmiyorum. Aslında bu veri C # kodu depolamak için en iyi yolu ve başlatmak için en iyi yolu bilmek için .NET framework iç hakkında bilmiyorum. Ben System.Globalization.CultureInfo.GetCulture(name)aslında ne istediğime çok benzer bir iş akışı olduğundan, nasıl çalıştığını görmek için .NET reflektör kullanarak etrafında dürttü . Ne yazık ki bu iz bir sona erdi extern, bu yüzden orada hiçbir ipucu. Benim örneğimde olduğu gibi, tüm verilerle statik bir özellik başlatılıyor mu? Yoksa talep üzerine nesneleri oluşturmak ve daha sonra önbelleklemek daha iyi olur mu?
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();
}
Bunları bir kerede statik bir üyede oluşturmanın avantajı, tüm nesnelere bakmak ve bunları sorgulamak için LINQ veya başka bir şey kullanabilmenizdir. Buna rağmen şüpheli bir başlangıç performans cezası var. Birisinin bu konuda tecrübesi olduğunu ve fikirlerini paylaşabileceğini umuyorum!