Кілька разів у минулому я хотів зберігати дані в коді. Це дані, які рідко змінюються і використовуються в місцях, де доступ до бази даних неможливий, практичний або бажаний. Невеликим прикладом може бути зберігання списку країн. Для цього ви можете зробити щось на кшталт:
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, я не знаю, що робити. Я не знаю достатньо внутрішніх даних .NET Framework, щоб знати найкращий спосіб фактично зберігати ці дані в коді C # та найкращі способи їх ініціалізації. Я роздумував за допомогою рефлектора .NET, щоб побачити, як 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 або що-небудь ще, щоб переглянути всі об'єкти і запитувати їх, якщо хочете. Хоча я підозрюю, що за це загрожує стартовий показник. Я сподіваюся, що хтось має досвід з цим і може поділитися своєю думкою!