मेरे अतीत में कुछ बार मैं कोड में डेटा स्टोर करना चाहता था। यह ऐसा डेटा होगा जो शायद ही कभी बदलता है और इसका उपयोग उन स्थानों पर किया जाता है जहां डेटाबेस तक पहुंच संभव नहीं है, व्यावहारिक या वांछनीय है। एक छोटा सा उदाहरण देशों की सूची तैयार करना होगा। उसके लिए आप कुछ ऐसा कर सकते हैं:
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 के लिए, मुझे नहीं पता कि क्या करना है। मैं वास्तव में इस डेटा को C # कोड में संग्रहीत करने और इसे प्रारंभ करने के सर्वोत्तम तरीकों को जानने के लिए .NET फ्रेमवर्क के आंतरिक के बारे में पर्याप्त नहीं जानता। मैं कैसे System.Globalization.CultureInfo.GetCulture(name)
काम करता है यह देखने के लिए .NET रिफ्लेक्टर का उपयोग करने के बारे में सोच रहा था , क्योंकि यह वास्तव में मैं क्या चाहता हूं के लिए एक बहुत ही समान वर्कफ़्लो है। दुर्भाग्य से यह निशान एक पर समाप्त हो गया 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 या जो कुछ भी उपयोग कर सकते हैं और यदि आप चाहें तो उन्हें क्वेरी कर सकते हैं। हालांकि मुझे संदेह है कि ऐसा करने से स्टार्टअप परफॉर्मेंस पेनल्टी लगती है। मुझे उम्मीद है कि किसी को इसके साथ अनुभव होगा और अपनी राय साझा कर सकता है!