存储300条目查找表(c#)的数据的方法

时间:2012-05-01 16:11:00

标签: c# web-config encapsulation appsettings lookup-tables

我目前正在扩展一些使用查找表的现有代码。现在,该表大约有25个条目,无论好坏,键/值都存储在web.conf的appsettings部分。它们被读入字典并在整个应用程序中使用。

我会将查找表的大小增加到大约300个条目,这是该域的完整值集 - 所以它不太可能变得更大,也不会经常更改。我不确定将这些数据保存在web.conf中是个好主意。数据库不是此实现的选项,因此我正在寻找另一种存储此数据的方法。我的一些想法是:

  • 静态字典?
  • Xml文件(或其他一些平面外部数据文件)
  • 将它留在web.conf的appsettings部分?

我倾向于在一个包含操作数据集的方法的类中填充静态字典。任何建议,评论或愤怒的呼声都将不胜感激。

4 个答案:

答案 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>>的结果不能正确序列化。