网站开发技巧, 使用byte[]持久化用户个性设置
场景, 网站用户的个性化配置较多, 而且容易发生增加和改变, 如何在数据库保存是个问题.
为了避免数据库表字段经常变更, 我们设计在表增加一个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"]);
}
网站开发技巧, 使用byte[]持久化用户个性设置的更多相关文章
- Qt开发的应用记录读取用户习惯设置的方法
Qt开发的应用记录读取用户习惯设置的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/w ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(1)用户注册
上一次把基本框架搭建起来了,这次开始整Web部分,终于可以看到界面了小激动一下.web项目部分从用户功能开始,基本有注册,登录.注销.查找.查看.删除等涉及Member区域和Manage区域. 目录: ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码
在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销
上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...
- MVC5 网站开发之七 用户功能 1、角色的后台管理
角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 ...
- MVC5 网站开发之七 用户功能 2 用户添加和浏览
目录 MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MVC5 网站开发之三 数据存储层功能实现 MVC5 网站开发之四 业务逻辑层的架构和基本功能 MVC5 网站开发之五 展示层架 ...
- MVC5 网站开发之七 用户功能 3用户资料的修改和删除
这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和& ...
- Android开发技巧——高亮的用户操作指南
Android开发技巧--高亮的用户操作指南 2015-12-15补记: 发现使用PopupWindow进行遮罩层的显示,在华为P7上会有问题.具体表现为:画出来的高亮部分会偏下.原因为:通过view ...
- MVC5 网站开发实践 2.1、管理员登陆
目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目 MVC5 网站开发实践 2.后台管理 1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...
随机推荐
- Swift学习笔记--变量与常量
1.Swift是一门强类型语言,不能为变量赋予其自身数据类型之外的值: 2.声明变量使用var关键字,声明常量使用let关键字: 3.声明变量或常量时没有对其指定类型且赋予了初值,则编译器会自动推断常 ...
- 使用LVS实现负载平衡之Windows Server 2008配置
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一.承载于 II ...
- 浅析selenium的page object模式
selenium目前比较流行的设计模式就是page object,那么到底什么是page object呢,简单来说,就是把页面作为对象,在使用中传递页面对象,来使用页面对象中相应的成员或者方法,能更好 ...
- 最小生成树 2429: [HAOI2006]聪明的猴子
BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 877 Solved: 566[Submit][ ...
- Daikon Forge GUI 制作图集和字体集
Daikon Forge GUI 制作UI面板 在上次的学习中制作了一个简单的面板,下面来学习制作图集以及字体. 1.DF-GUI 图集(Atlas)制作 操作步骤 选中UI Root根节点,在Sce ...
- linux启动jmeter,执行./jmeter.sh报错解决方法
1.l-bash: ./jmeter.sh: Permission denied解决办法:jmeter.sh的执行权限改改,是权限不够chmod 777 jmeter.sh 2.An error oc ...
- JMeter学习(十九)JMeter测试MongoDB
JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接进行测试MongoDB,还有一种是写Java代码方式测试MongoDB性能. 第一种方法 1.编写Java代码,内容如下: pa ...
- [ORACLE错误]ORA-00001: unique constraint (...) violated并不一定是数据冲突
遇到这种情况,重建完表和索引后,终于正常INSERT了. prompt Importing table COUPON_ACTIVITYset feedback offset define offin ...
- java 13-4 Integer和String、int之间的转换,进制转换
1.int类型和String类型的相互转换 A.int -- String 推荐用: public static String valueOf(int i) 返回 int 参数的字符串表示形式. B. ...
- js原生选项卡(包含无缝滚动轮播图)一
原生js选项卡的几种写法,整片文章我会由简及难的描述几种常用的原生选项卡的写法: Improve little by little every day! 1>基本选项卡: 思路:循环中先清除再添 ...