我过去几次想将数据存储在代码中。这将是很少更改的数据,并用于不可能,不实际或不希望访问数据库的地方。一个小例子是存储国家列表。为此,您可以执行以下操作:
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文件编译为程序集资源。根据需要加载数据,将加载的数据存储到Dictionary中以提高重复使用性能。
- 生成某种静态对象或在启动时初始化的对象。
我非常确定我了解选项1的性能含义。至少,我的直觉是它不会具有出色的性能。
至于选项2,我不知道该怎么办。我对.NET框架的内部了解不多,无法知道将数据实际存储在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或其他任何方式查看所有对象并根据需要查询它们。尽管我怀疑这样做会降低启动性能。我希望有人对此有经验并可以分享他们的意见!