我有一个对象代表正在发生的当前事件。此事件包含许多设置。将所有设置变量存储在事件对象中的最佳做法是什么?
设置存储在数据库中(现在基于基类的不同列: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)
...
}
有什么想法吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
我真的喜欢dasblinkenlight的回答。
除了为每种数据类型浪费一列之外,我宁愿在数据表上只有一列(可能是一个VARCHAR)。
这样做的好处:
然后你可以使用提到的泛型,或者将你的实现中的字符串对象强制转换为你想要的类型。