2

我有一个代表正在发生的当前事件的对象。这个事件包含很多设置。将所有设置变量存储在事件对象中的最佳做法是什么?

这些设置存储在数据库中(现在基于基类的不同列中:ValueString、ValueInt、ValueBool、ValueDateTime、ValueFloat、ValueDecimal)。唯一键代表数据库中的设置。

一旦我加载了事件对象,我会将它存储在本地缓存中以便快速访问。

我应该把一切都反对吗?(感觉就像不需要强制转换来获取/设置设置)

class Event
{
    // string = settings key
    Dictionary<string, object> _settings;

    public void AddSetting(string key, object value)
    public object GetSetting(string key)
}

或者我应该把它放在不同的字典里吗?

class Event
{
    // string = settings key
    Dictionary<string, string> _settingStrings;
    Dictionary<string, int> _settingInts;
    ...

    public void AddSetting(string key, string value)
    public void AddSetting(string key, int value)
    ...

    public string GetStringSetting(string key)
    public int GetIntSetting(string key)    
    ...
}

有任何想法吗?

4

2 回答 2

5

您可以将所有内容存储为Object,但不是执行直接转换,而是使用泛型来构建易于使用的 API:

private IDictionary<string,object> _settings = new Dictionary<string,object>();

public void AddSetting<T>(string key, T value) {
    _settings[key] = value;
}
public T GetSetting<T>(string key, T notFound = default(T)) {
    object res;
    if (!_settings.TryGetValue(key, out res) || !(res is T)) {
        return notFound;
    }
    return (T)res;
}

演员表仍然存在,但 API 对用户隐藏了它:现在用户可以安全地编写

string searchPath = settingContainer.GetSetting<string>("searchPath");
int retryCount = settingContainer.GetSetting<int>("retryCount", -1);
于 2013-06-22T10:02:47.577 回答
0

我真的很喜欢 dasblinkenlight 的回答。

除了为每种数据类型浪费一列之外,我宁愿在您的数据表上只有一列(可能是 VARCHAR)。

这样做的好处:

  • 更快的阅读(只有一个索引列)
  • 节省存储空间(每行只有一个 varchar)

然后你可以使用前面提到的泛型,或者将你的实现中的字符串对象转换为你想要的类型。

于 2013-06-22T10:14:30.943 回答