网站开发技巧, 使用byte[]持久化用户个性设置
2024-08-29 17:27:52
场景, 网站用户的个性化配置较多, 而且容易发生增加和改变, 如何在数据库保存是个问题.
为了避免数据库表字段经常变更, 我们设计在表增加一个varbinary(max)字段存储个性化配置.
个性化的配置则存储到dictionary<string,string>中. 然后序列化成bytes即可.
见代码
先来一个帮助类
///
/// 持久个性化设置的类 public class ModelSetting
///
{ private Dictionary _hash;
public ModelSetting() {
_hash = new Dictionary();
} ///
/// 把数据库中的bytes转化成可用的dictionary ///
///
public void Load(byte[] bytes)
{
using (MemoryStream ms1 = new MemoryStream(bytes)) {
BinaryFormatter bf = new BinaryFormatter();
_hash = (Dictionary)bf.Deserialize(ms1);
}
}
///
/// 把实体中的dictionary转成bytes ///
///
public byte[] ToByteArray()
{
using (MemoryStream ms1 = new MemoryStream())
{
BinaryFormatter b = new BinaryFormatter();
b.Serialize(ms1, _hash);
return ms1.ToArray();
}
} public ICollection Keys
{
get
{
return _hash.Keys;
}
} public string Get(string Name, string Def){
if (_hash.ContainsKey(Name))
return _hash[Name];
else
return Def;
}
public void Set(string Name, string Val)
{
if (Val == null)
Val = "";
_hash[Name] = Val;
}
}
然后在domain中的模型中增加如下代码
///
/// Setting设置帮助类 protected ModelSetting modelsetting = new ModelSetting();
///
private Dictionary _allSettings = new Dictionary();
private bool _isLoaded = false;
///
/// 通过这个访问个性化设置 public Dictionary AllSettings
///
{
get {
if (!_isLoaded)
LoadSettings();
return _allSettings;
}
} ///
/// 将二进制的内容加载成具体的对象 private void LoadSettings()
///
{
if (Settings != null && Settings.Length > 1)
{
modelsetting.Load(Settings); _allSettings.Clear();
foreach (string key in modelsetting.Keys)
{
_allSettings.Add(key, modelsetting.Get(key, string.Empty));
} _isLoaded = true;
}
}
///
/// 将单一的某个设置的键值对,存入网站本身二进制的Setting里. ///
/// 本方法只是临时将键值对,放入字典。真正更新数据库,还需要SaveSetting()再Update(YibuSite)
///
///
public void SetOneSetting(string key, string value)
{
if (AllSettings.ContainsKey(key))
{
AllSettings[key] = value;
}
else
{
AllSettings.Add(key, value);
}
}
public void SaveSetting()
{
foreach (string key in _allSettings.Keys)
{
modelsetting.Set(key, _allSettings[key]);
}
Settings = modelsetting.ToByteArray();
}
存储和取值
public ActionResult TestModelSetting() {
var temp = _userservice.Table.First();
temp.SetOneSetting("xiaomi", "jianjialin");
temp.SetOneSetting("mobile","13900000000");
temp.SaveSetting();
_userservice.Update(temp); var temp2 = _userservice.Table.First();
return Content(temp2.AllSettings["xiaomi"]);
}
最新文章
- 基于Caffe的DeepID2实现(上)
- 翻译:使用 ASP.NET MVC 4, EF, Knockoutjs and Bootstrap 设计和开发站点 - 6 - 业务逻辑
- Debian/Ubuntu server上安装安全更新
- win10 设置 计算机/此电脑/我的电脑 图标到桌面上
- informatica 学习日记整理
- [hackerrank]Closest Number
- (转载)linux那点事儿(中)
- Smarty 插件开发
- SignalR1
- ring3 hook ZwWriteVirtualMemory
- 内嵌的Component调用外部的方法
- 深入分析Android动画(一)
- iOS视频边下载边播放
- gdb 脚本调试
- Pass的通用指令开关
- tf变换(1)
- Java多线程详解(三)
- linux 学习第十一天
- 聊聊flink Table的groupBy操作
- 百度王一男: DevOps 的前提是拆掉业务-开发-测试-运维中间的三面墙
热门文章
- xamarin.android 图片高斯模糊效果
- Quicksum-S.B.S.
- runc的detach, console, tty等相关问题
- java使用HttpClient传输json格式的参数
- 莫比乌斯反演 BZOJ 2820
- UVA-10828 (概率期望+高斯消元)
- 第12章 纤程(Fiber)
- 贴图在Unity中的设置
- 转: Red Hat/Fedora Linux 上使用 yum 安装 python pip 模块
- 024医疗项目-模块二:药品目录的导入导出-HSSF导入类的学习