zoukankan      html  css  js  c++  java
  • 网站开发技巧, 使用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"]);
            }
  • 相关阅读:
    随笔
    转:windows 下 netsh 实现 端口映射(端口转发)
    2015年01月01日:新年第一天:happy new year to myself
    谨记一次问题排查经历
    新机器,分区为NTFS, 安装 Windows XP、Windows Server 2003 时蓝屏问题,修改为 FAT32 即可
    Oracle 11g 的bug?: aix 上,expdp 11.2.0.1 导出,impdp 11.2.0.3 导入,Interval 分区的 【Interval】 分区属性成了【N】
    Cursor for loop in Oracle
    Oracle date 详解
    oracle中to_timestamp和to_date什么区别
    Oracle FM FM09999999 确保8位数字 即使全是0
  • 原文地址:https://www.cnblogs.com/jianjialin/p/5326433.html
Copyright © 2011-2022 走看看