基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(3)
生活随笔
收集整理的這篇文章主要介紹了
基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(3)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前面兩邊的代碼就是一套初步的工具包架構,基本底層通用,可以移植到任意項目實現類似的需求。接下來,再在我們特定的項目幾微助手里面再實現一套基于自己項目的基類,根據項目需求抽象一下項目內的常用方法。理論上,這一步的抽象,如果移植到其他項目,應該也是有一定的通用性。
| 1 |
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | /// <summary>???/// 站點設置的基類,基類主要提供站點擴展設置的數據庫連接等操作???/// </summary>???public abstract class BaseSiteExtensions:BaseExtensions???{???????public Guid SiteUnid {?get;?set; }???????private MiniSiteDataExtensionsEntities _dataContext =?null;???????/// <summary>???????/// 數據操作實例???????/// </summary>???????public virtual MiniSiteDataExtensionsEntities DataContext???????{???????????get???????????{???????????????if (this._dataContext ==?null)???????????????????this._dataContext = MiniSiteDataExtensionsEntities.GetContext(this.SiteUnid);???????????????return this._dataContext;???????????}???????????set???????????{???????????????this._dataContext = value;???????????}???????}???????/// <summary>???????/// 站點擴展設置初始化???????/// </summary>???????/// <param name="siteunid"></param>???????public BaseSiteExtensions(Guid siteunid):base()???????{???????????this.SiteUnid = siteunid;???????}???????/// <summary>???????/// 打開一個數據連接???????/// </summary>???????public virtual void OpenConnection()???????{???????????if (this.DataContext.Database.Connection.State == ConnectionState.Closed)???????????????this.DataContext.Database.Connection.Open();???????}???????/// <summary>???????/// 關閉數據庫聯機并銷毀對象???????/// </summary>???????public virtual void CloseConnection()???????{???????????if (this.DataContext.Database.Connection.State != ConnectionState.Closed)???????????????this.DataContext.Database.Connection.Close();???????????this.DataContext.Dispose();???????????this.DataContext =?null;???????}???} |
在幾微助手里面,有站點的概念,這里是為站點的擴展配置,做一套管理基類。用于管理站點的Key-Value數據庫。這里用到的EF數據庫實例就是上篇里面的MiniSiteDataExtensionsEntities(這里也可以用其它的,在表結構相同的情況下,通過繼承后在實現自己的數據庫操作類,根據自己的需求來管理EF的數據文件。)
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 | /// <summary>????/// 站點的擴展設置基類????/// </summary>????public class BaseSiteSettingExtensions:BaseSiteExtensions????{????????public? event ItemSaved OnItemSaved;????????public? event AllItemsSaved OnAllItemsSaved;????????public virtual SettingEditorDictionary EditorItems {?get;?set; }????????protected string TypeName {?get;?set; }????????/// <summary>????????/// 根據指定類型初始化站點擴展設置????????/// </summary>????????/// <param name="siteunid"></param>????????/// <param name="typename"></param>????????public BaseSiteSettingExtensions(Guid siteunid,string typename):base(siteunid)????????{????????????this.TypeName = typename;????????}????????/// <summary>????????/// 從數據庫讀取鍵值,將指定key的設置以泛型方式獲取對象的實例????????/// </summary>????????/// <typeparam name="T">對象類型</typeparam>????????/// <param name="key">配置的鍵</param>????????/// <returns>返回配置對象的實例</returns>????????public virtual T GetValue<T>(string key)????????{????????????T result=?default(T);????????????string res=this.GetValue(key);????????????if (!string.IsNullOrWhiteSpace(res))????????????????result = JsonConvert.DeserializeObject<T>(res);????????????return result;????????}????????/// <summary>????????/// 獲取指定key的擴展設置值????????/// </summary>????????/// <param name="key">設置的鍵</param>????????/// <returns>返回值的字符串形式</returns>????????public virtual string GetValue(string key)????????{????????????????return this.GetValue(this.TypeName, key);????????}????????/// <summary>????????/// 根據key獲取指定類型的擴展設置值????????/// </summary>????????/// <param name="typename">設置類型的枚舉</param>????????/// <param name="key">設置的鍵</param>????????/// <returns>返回值的字符串形式</returns>????????public virtual string GetValue(string typename,string key)????????{????????????string result =?null;????????????if (this.DataContext.SettingExtensions.Count(m => m.TypeName == typename.ToString() && m.Key == key.ToLower()) > 0)????????????{????????????????SettingExtension setting =?this.DataContext.SettingExtensions.Single(m => m.TypeName == typename.ToString() && m.Key == key.ToLower());????????????????result = setting.Value;????????????}????????????this.CloseConnection();????????????return result;????????}????????/// <summary>????????/// 保存指定鍵的項????????/// </summary>????????/// <param name="key">需要保存的配置鍵</param>????????public virtual void SaveItem(string key)????????{????????????this.SaveItem(this.TypeName, key,?this.Items[key.ToLower()]);????????}????????/// <summary>????????/// 更新或者添加指定鍵值的單個配置????????/// </summary>????????/// <param name="key">需要保存的配置鍵</param>????????/// <param name="value"></param>????????public virtual void SaveItem(string key,?string value)????????{????????????this.SaveItem(this.TypeName, key, value);????????}????????/// <summary>????????/// 保存設置項????????/// </summary>????????/// <param name="item">設置項實</param>????????public virtual void SaveItem(SettingItem item)????????{????????????this.SaveItem(this.TypeName, item.Key, item.Value);????????}????????/// <summary>????????/// 保存指定設置類型的設置項目????????/// </summary>????????/// <param name="typename"></param>????????/// <param name="item"></param>????????public virtual void SaveItem(string typename, SettingItem item)????????{????????????this.SaveItem(typename, item.Key, item.Value);????????}????????/// <summary>????????/// 跟新或添加設置????????/// </summary>????????/// <param name="typename"></param>????????/// <param name="key"></param>????????/// <param name="value"></param>????????public virtual void SaveItem(string typename,?string key,?string value)????????{????????????if (this.DataContext.SettingExtensions.Count(m => m.TypeName == typename.ToString() && m.Key == key.ToLower()) > 0)????????????{????????????????SettingExtension setting =?this.DataContext.SettingExtensions.AsEnumerable().Single(m => m.TypeName == typename.ToString() && m.Key == key.ToLower());????????????????setting.Value = value;????????????}????????????else????????????{????????????????SettingExtension setting =?new SettingExtension();????????????????setting.SettingID = Guid.NewGuid();????????????????setting.TypeName = typename.ToString();????????????????setting.Key = key.ToLower();????????????????setting.Value = String.IsNullOrEmpty(value)?"":value;????????????????this.DataContext.SettingExtensions.Add(setting);????????????}????????????this.DataContext.SaveChanges();????????????this.CloseConnection();????????????this.SetItem(key, value);????????????OnItemSaved?.Invoke(this, key);????????}????????/// <summary>????????/// 跟新或者新建擴展設置????????/// </summary>????????public virtual void SaveAllItems()????????{????????????this.SaveAllItems(this.Items);????????}????????/// <summary>????????/// 用自定的配置字典對象批量更新站點設????????/// </summary>????????/// <param name="items"></param>????????public virtual void SaveAllItems(SettingDictionary items)????????{????????????this.SaveAllItems(this.TypeName, items);????????}????????/// <summary>????????/// 批量添加或更新設置????????/// </summary>????????/// <param name="typename"></param>????????/// <param name="items"></param>????????public virtual void SaveAllItems(string typename, SettingDictionary items)????????{????????????foreach (SettingItem kv?in items)????????????{????????????????try????????????????{????????????????????if (this.DataContext.SettingExtensions.Count(m => m.TypeName == typename.ToString() && m.Key == kv.Key.ToLower()) > 0)????????????????????{????????????????????????SettingExtension setting =?this.DataContext.SettingExtensions.Single(m => m.TypeName == typename.ToString() && m.Key == kv.Key.ToLower());????????????????????????if (setting.Value == kv.Value)????????????????????????{????????????????????????????continue;????????????????????????}????????????????????????else????????????????????????{????????????????????????????setting.Value = kv.Value;????????????????????????}????????????????????}????????????????????else????????????????????{????????????????????????SettingExtension setting =?new SettingExtension();????????????????????????setting.SettingID = Guid.NewGuid();????????????????????????setting.TypeName = typename.ToString();????????????????????????setting.Key = kv.Key.ToLower();????????????????????????setting.Value = String.IsNullOrEmpty(kv.Value) ??"" : kv.Value;????????????????????????this.DataContext.SettingExtensions.Add(setting);????????????????????}????????????????}????????????????catch(Exception e)????????????????{????????????????????SiteLog.Debug(kv.Key,kv.Value);????????????????}????????????}????????????this.DataContext.SaveChanges();????????????this.CloseConnection();????????????OnAllItemsSaved?.Invoke(this);????????}????????/// <summary>????????/// 讀取數據,并通過讀取的鍵值對填充配置的Items屬性????????/// </summary>????????public virtual void GetItems()????????{????????????this.GetItems(this.TypeName);????????}????????/// <summary>????????/// 根據string枚舉屬性讀取數據,并通過讀取的鍵值對填充配置的Items屬性????????/// </summary>????????/// <param name="typename"></param>????????public virtual void GetItems(string typename)????????{????????????List<SettingExtension> list =?this.GetSettingExtensions(typename);????????????if (list !=?null)????????????{????????????????foreach (SettingExtension setting?in list)????????????????{????????????????????if (this.Items.ContainsKey(setting.Key.ToLower()) && !String.IsNullOrEmpty(setting.Value))????????????????????{????????????????????????this.Items[setting.Key.ToLower()] = setting.Value;????????????????????}????????????????}????????????}????????}????????/// <summary>????????/// 獲取配置擴展的實例對象列表????????/// </summary>????????/// <returns>返回特定類型的配置對象列表</returns>????????public virtual List<SettingExtension> GetSettingExtensions()????????{????????????return this.GetSettingExtensions(this.TypeName);????????}????????/// <summary>????????/// 獲取指定類型的擴展信息列表????????/// </summary>????????/// <param name="typename">配置類型枚舉</param>????????/// <returns>返回指定類型的配置對象列表</returns>????????public virtual List<SettingExtension> GetSettingExtensions(string typename)????????{????????????List<SettingExtension> result =?null;????????????if (this.DataContext.SettingExtensions.Count(m => m.TypeName == typename.ToString()) > 0)????????????{????????????????result =?this.DataContext.SettingExtensions.Where(m => m.TypeName == typename.ToString()).ToList();????????????}????????????this.CloseConnection();????????????return result;????????}????????/// <summary>????????/// 解析表單提交的設置,并根據表單提交數據對設置重新修改賦值????????/// </summary>????????/// <param name="form">前端UI提交的表單對象</param>????????public virtual void ParseFormSettingValues(FormCollection form)????????{????????????foreach (SettingItem item?in this.Items)????????????{????????????????if (this.EditorItems.ContainsKey(item.Key))????????????????{????????????????????switch (this.EditorItems[item.Key].TagName.ToLower())????????????????????{????????????????????????case "bool":????????????????????????????if (form[item.Key] ==?null)????????????????????????????????this.SetItem<bool>(item.Key,?false);????????????????????????????else????????????????????????????????this.SetItem<bool>(item.Key,?bool.Parse(form[item.Key]));????????????????????????????break;????????????????????????default:????????????????????????????this.SetItem(item.Key, form[item.Key]);????????????????????????????break;????????????????????}????????????????}????????????????else????????????????{????????????????????if (form[item.Key] ==?null)????????????????????????continue;????????????????????else????????????????????????this.SetItem(item.Key, form[item.Key]);????????????????}????????????}????????}????} |
BaseSiteSettingExtensions這里是實現一套基于集合的擴展類。第一篇講的數據表里面,我們的Key-Value數據表是有兩個的。一個是模塊整體的配置,一個是模塊里面單個對象的設置。這個類就是管理前者。
這個就是管理模塊單項配置的基類。
總結
以上是生活随笔為你收集整理的基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于SQLite+EF6实现一套自己的K
- 下一篇: 基于SQLite+EF6实现一套自己的K