Beberapa kali di masa lalu saya, saya ingin menyimpan data dalam kode. Ini akan menjadi data yang jarang berubah dan digunakan di tempat-tempat di mana akses ke database tidak mungkin, praktis, atau diinginkan. Contoh kecil akan menyimpan daftar negara. Untuk itu Anda bisa melakukan sesuatu seperti:
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);
}
}
Saya lolos dengan melakukan ini di masa lalu karena set data relatif kecil dan objeknya cukup sederhana. Sekarang saya sedang mengerjakan sesuatu yang akan memiliki objek yang lebih kompleks (5 - 10 properti masing-masing, beberapa properti menjadi kamus) dan sekitar 200 objek total.
Data itu sendiri berubah sangat jarang dan ketika itu berubah itu benar-benar tidak penting. Jadi menggulungnya ke versi rilis berikutnya sangat baik.
Saya berencana untuk menggunakan T4 atau ERB atau solusi templating lainnya untuk mengubah sumber data saya menjadi sesuatu yang disimpan secara statis dalam perakitan.
Sepertinya pilihan saya
- Simpan data dalam XML. Kompilasi file XML sebagai sumber rakitan. Muat data sesuai kebutuhan, simpan data yang dimuat ke dalam Kamus untuk kinerja penggunaan yang berulang.
- Menghasilkan beberapa jenis objek statis atau objek yang diinisialisasi saat startup.
Saya cukup yakin saya memahami implikasi kinerja opsi 1. Setidaknya, firasat saya adalah bahwa ia tidak akan memiliki kinerja bintang.
Adapun opsi 2, saya tidak tahu harus berbuat apa. Saya tidak cukup tahu tentang internal. NET framework untuk mengetahui cara terbaik untuk benar-benar menyimpan data ini dalam kode C # dan cara terbaik untuk menginisialisasi itu. Saya mencari-cari menggunakan reflektor .NET untuk melihat cara System.Globalization.CultureInfo.GetCulture(name)
kerjanya, karena ini sebenarnya alur kerja yang sangat mirip dengan apa yang saya inginkan. Sayangnya jejak itu berakhir pada extern
, jadi tidak ada petunjuk di sana. Apakah menginisialisasi properti statis dengan semua data, seperti dalam contoh saya, cara untuk pergi? Atau akan lebih baik untuk membuat objek sesuai permintaan dan kemudian cache, seperti ini?
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();
}
Keuntungan membuat mereka sekaligus di anggota statis adalah Anda dapat menggunakan LINQ atau apa pun untuk melihat semua objek dan meminta mereka jika Anda mau. Meskipun saya curiga melakukan ini memiliki penalti kinerja startup. Saya berharap seseorang memiliki pengalaman dengan ini dan dapat membagikan pendapat mereka!