• 网站开发技巧, 使用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"]);
            }
  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/jianjialin/p/5326433.html
Copyright © 2020-2023  润新知