ในอดีตของฉันสองสามครั้งฉันต้องการเก็บข้อมูลในรหัส นี่จะเป็นข้อมูลที่ไม่ค่อยมีการเปลี่ยนแปลงและถูกนำไปใช้ในสถานที่ที่ไม่สามารถเข้าถึงฐานข้อมูลได้ในทางปฏิบัติหรือเป็นที่ต้องการ ตัวอย่างเล็ก ๆ จะเก็บรายชื่อประเทศ เพื่อที่คุณสามารถทำสิ่งที่ชอบ:
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);
}
}
ฉันทำไปแล้วในอดีตเพราะชุดข้อมูลมีขนาดค่อนข้างเล็กและวัตถุค่อนข้างเรียบง่าย ตอนนี้ฉันกำลังทำงานกับบางสิ่งที่จะมีวัตถุที่ซับซ้อนมากขึ้น (คุณสมบัติ 5 - 10 รายการคุณสมบัติบางอย่างเป็นพจนานุกรม) และวัตถุประมาณ 200 รายการ
ข้อมูลตัวเองเปลี่ยนแปลงน้อยมากและเมื่อมีการเปลี่ยนแปลงมันไม่ได้สำคัญจริงๆ ดังนั้นการกลิ้งไปสู่เวอร์ชั่นที่วางจำหน่ายครั้งต่อไปนั้นดีมาก
ฉันวางแผนที่จะใช้ T4 หรือ ERB หรือโซลูชันเทมเพลตอื่น ๆ เพื่อเปลี่ยนแหล่งข้อมูลของฉันเป็นสิ่งที่เก็บไว้ในแอสเซมบลีแบบคงที่
ดูเหมือนว่าตัวเลือกของฉันคือ
- เก็บข้อมูลใน XML รวบรวมไฟล์ XML เป็นทรัพยากรการชุมนุม โหลดข้อมูลตามต้องการจัดเก็บข้อมูลที่โหลดลงในพจนานุกรมเพื่อประสิทธิภาพการใช้ซ้ำ
- สร้างวัตถุหรือวัตถุที่คงค่าเริ่มต้นเมื่อเริ่มต้นบางประเภท
ฉันค่อนข้างแน่ใจว่าฉันเข้าใจความหมายของประสิทธิภาพการทำงานของตัวเลือก 1 อย่างน้อยลางสังหรณ์ของฉันคือว่ามันจะไม่มีประสิทธิภาพเป็นตัวเอก
สำหรับตัวเลือกที่ 2 ฉันไม่รู้จะทำอย่างไร ฉันไม่รู้เกี่ยวกับ internals ของ. NET Framework เพื่อทราบวิธีที่ดีที่สุดในการจัดเก็บข้อมูลนี้ในรหัส C # และวิธีที่ดีที่สุดในการเริ่มต้นมัน ฉันแหย่ไปรอบ ๆ โดยใช้. NET reflector เพื่อดูว่ามันSystem.Globalization.CultureInfo.GetCulture(name)
ทำงานอย่างไรจริง ๆ แล้วนี่เป็นเวิร์กโฟลว์ที่คล้ายกันมากกับสิ่งที่ฉันต้องการ น่าเสียดายที่เส้นทางนั้นจบลงด้วยการextern
ไม่มีคำแนะนำ กำลังเริ่มต้นคุณสมบัติคงที่พร้อมกับข้อมูลทั้งหมดอย่างในตัวอย่างของฉันไปทางไหน? หรือมันจะเป็นการดีกว่าถ้าคุณสร้างวัตถุตามต้องการจากนั้นแคชพวกมันเช่นนี้?
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();
}
ข้อได้เปรียบในการสร้างพวกเขาในครั้งเดียวในสมาชิกแบบคงที่คือคุณสามารถใช้ LINQ หรือสิ่งอื่นเพื่อดูวัตถุทั้งหมดและค้นหาพวกเขาหากคุณต้องการ แม้ว่าฉันสงสัยว่าการทำเช่นนี้จะมีโทษประสิทธิภาพในการเริ่มต้น ฉันหวังว่าบางคนจะมีประสบการณ์กับสิ่งนี้และสามารถแบ่งปันความคิดเห็นของพวกเขา!