我目前正在扩展一些使用查找表的现有代码。现在,该表大约有25个条目,无论好坏,键/值都存储在web.conf的appsettings部分。它们被读入字典并在整个应用程序中使用。
我会将查找表的大小增加到大约300个条目,这是该域的完整值集 - 所以它不太可能变得更大,也不会经常更改。我不确定将这些数据保存在web.conf中是个好主意。数据库不是此实现的选项,因此我正在寻找另一种存储此数据的方法。我的一些想法是:
我倾向于在一个包含操作数据集的方法的类中填充静态字典。任何建议,评论或愤怒的呼声都将不胜感激。
答案 0 :(得分:7)
您可以将其他键值对存储在通过appSettings元素引用的配置文件中 - 这可以使您的主配置文件保持整洁,并将其他配置存储在其自己的相关配置文件中。
文章MSDN - appSettings Element (General Settings Schema)中对此进行了解释。
这实际上是您的第二和第三项的组合。
出于维护原因,我不会把它放在代码中的静态字典中 - 配置文件也是这个数据更明显的地方。通过利用内置的.Net功能,您也不会冒其他人忽略Xml文件的风险。
更具体的例子是(注意文件路径是相对于主应用程序的):
<强>的app.config:强>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings file="mykeyvaluepairs.config"/>
</configuration>
<强> mykeyvaluepairs.config 强>
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="imaginativelynamedkey1" value="imaginativelynamedvalue1" />
</appSettings>
请注意,在原始app.config中,还可以执行以下操作:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings file="mykeyvaluepairs.config">
<add key="CanBeOverridenByItemInChildConfigFileWithSameName" value="UnicornsGoHere" />
</appSettings>
</configuration>
也就是说,除非您重新定义mykeyvaluepairs.config文件中的appsettings,否则它们将并排存在 - 但mykeyvaluepairs.config中具有相同名称的项目将覆盖主配置中的值。
答案 1 :(得分:0)
如果您要求封装,最好的方法是公开一个接口,它将返回您想要的值,然后注入具体的实现。多亏了这一点,您可以轻松地更改实施。
当它实现时,如果数据永远不会更改或更改是针对下一个版本(基本上,如果只有开发人员可以进行更改),我会选择基础字典(并将其配置为DI容器中的Singleton)。更重要的是,我会将键保持为枚举值,以提供额外的类型安全性。恕我直言,如果管理员或业务用户无法配置某些内容,只能将其保留在外部配置中,则会增加不必要的复杂性。
答案 2 :(得分:0)
这是一个Xml文件示例。你可以利用它:
string value = MyConfig.Items[key];
要为其添加新值:
MyConfig.Write(file => file.Add("newKey", "newValue"));
班级:
public class MyConfig : IDisposable
{
string file = "path to file"; // probably in App_Data if this is asp.net
XElement self;
public MyConfig()
{
if(File.Exists(file))
self = XElement.Load(file);
else
self = new XElement("root");
}
public void Add(string key, string value)
{
if (!Items.ContainsKey(key))
{
self.Add(new XElement("pair",
new XAttribute("Key", key),
new XAttribute("Value", value)));
_Items = null;
}
}
public void Dispose()
{
self.Save(file);
}
public static Dictionary<string, string> Items
{
get
{
if (null == _Items)
{
_Items = Read.self.Elements().ToDictionary(
x => x.Attribute("Key").Value,
x => x.Attribute("Value").Value);
}
return _Items;
}
}
static Dictionary<string, string> _Items;
public static MyConfig Read { get { return new MyConfig(); } }
public static void Write(Action<MyConfig> action)
{
using (MyConfig config = new MyConfig())
action(config);
}
}
您可能希望在分配/读取_Items变量时锁定它,因为网站是多线程的。
答案 3 :(得分:0)
Dictionary
是处理代码中的键/值信息的不错选择。最好保持配置文件的精简和意味着所以不要把所有300个键和值放在那里。您可以使用XML序列化在单独的XML文件中轻松存储(和加载)庞大或众多的自定义设置。看起来很适合你的情况。
使用此示例代码将数据保存到XML或从XML加载数据。
public class KeyValue
{
public string Key;
public string Value;
}
static void Save()
{
// some test data
Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("key1", "value1");
dict.Add("key2", "value2");
dict.Add("key3", "value3");
dict.Add("key4", "value4");
// convert to List
List<KeyValue> list1 = (from itm in dict
select new KeyValue
{
Key = itm.Key, Value = itm.Value
}).ToList();
// serialize
using (StreamWriter sw = new StreamWriter("C:\\temp\\config.xml"))
{
XmlSerializer xs = new XmlSerializer(typeof (List<KeyValue>));
xs.Serialize(sw, list1);
sw.Close();
}
}
static void Load()
{
// deserialize
using (StreamReader sr = new StreamReader("c:\\temp\\config.xml"))
{
XmlSerializer xs = new XmlSerializer(typeof (List<KeyValue>));
List<KeyValue> list2 = (List<KeyValue>) xs.Deserialize(sr);
sr.Close();
}
// convert to Dictionary
Dictionary<string, string> dict2 = list2.ToDictionary(x => x.Key, x => x.Value);
}
注意:您需要KeyValue
辅助类,因为dict.ToList()
List<KeyValuePair<string,string>>
的结果不能正确序列化。