基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(2)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                上一篇里面整理了一下需求和思路,自定義了擴展的字典對象,這里我們再繼續深入編碼。
BaseExtensions類,這個類作未來任何需要Key-Value形式擴展的基類
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | /// <summary>???/// 擴展設置的操作基類,該類不能實例化,該抽象對象主要提供配置的轉化和讀取操作???/// </summary>???public abstract class BaseExtensions???{???????/// <summary>???????/// 創建對象修改后事件???????/// </summary>???????public event ItemChanged OnItemChanged;???????/// <summary>???????/// 建立對象設置字典的虛方法。在派生類中可以重寫改方法???????/// </summary>???????public virtual SettingDictionary Items {?get;?set; }???????public BaseExtensions()???????{???????}???????/// <summary>???????/// 返回指定值得的Json字符串表現形式???????/// </summary>???????/// <param name="value"></param>???????/// <returns></returns>???????public virtual string ToJson(object value)???????{???????????string result = JsonConvert.SerializeObject(value);???????????return result;???????}???????/// <summary>???????/// 指定對象轉換為json字符串???????/// </summary>???????/// <typeparam name="T">要轉換的對象</typeparam>???????/// <param name="value">對象值</param>???????/// <returns>返回轉換的json字符串</returns>???????public virtual string ToJson<T>(T value)???????{???????????string result = JsonConvert.SerializeObject(value);???????????return result;???????}???????/// <summary>???????/// 為指定的鍵設置值的實例???????/// </summary>???????/// <param name="key">關鍵字</param>???????/// <param name="value">對應的值</param>???????public virtual void SetItem(string key,?object value)???????{???????????string v =?this.ToJson(value);???????????if (this.Items.ContainsKey(key.ToLower()))???????????????this.Items[key.ToLower()] = v;???????????else???????????????this.Items.Add(key.ToLower(), v);???????????if (OnItemChanged !=?null)???????????????OnItemChanged(this, key);???????}???????/// <summary>???????/// 為指定的鍵設置對象類的值???????/// </summary>???????/// <typeparam name="T"></typeparam>???????/// <param name="key"></param>???????/// <param name="value"></param>???????public virtual void SetItem<T>(string key, T value)???????{???????????string v =?this.ToJson(value);???????????if (this.Items.ContainsKey(key.ToLower()))???????????????this.Items[key.ToLower()] = v;???????????else???????????????this.Items.Add(key.ToLower(), v);???????????if (OnItemChanged !=?null)???????????????OnItemChanged(this, key);???????}???????/// <summary>???????/// 為指定的鍵設置字符串類型的值???????/// </summary>???????/// <param name="key"></param>???????/// <param name="value"></param>???????public virtual void SetItem(string key,?string value)???????{???????????if (this.Items.ContainsKey(key.ToLower()))???????????????this.Items[key.ToLower()] = value;???????????else???????????????this.Items.Add(key.ToLower(), value);???????????if (OnItemChanged !=?null)???????????????OnItemChanged(this, key);???????}???????/// <summary>???????/// 從字典對象緩存讀取鍵值,將指定key的設置以泛型方式獲取對象的實例???????/// </summary>???????/// <typeparam name="T">對象類型</typeparam>???????/// <param name="key">配置的鍵</param>???????/// <returns>返回配置對象的實例</returns>???????public virtual T GetItem<T>(string key)???????{???????????T result=default(T);???????????string res =?this.Items[key.ToLower()];???????????if (!String.IsNullOrEmpty(res))???????????????result = JsonConvert.DeserializeObject<T>(res);???????????return result;???????}???????/// <summary>???????/// 根據關鍵字獲取值???????/// </summary>???????/// <param name="key"></param>???????/// <returns></returns>???????public virtual string GetItem(string key)???????{???????????string result =?this.Items[key.ToLower()];???????????return result;???????}???} | 
?
MiniSiteDataExtensionsEntities數據庫實體類,這里的例子是SQLite,EF6生成的代碼這里不做重復,這里MiniSiteDataExtensionsEntities的代碼是以?public partial class MiniSiteDataExtensionsEntities的方式存在,是用來擴展EF的實體類MiniSiteDataExtensionsEntities(命名方式我系統內的使用)這個東東主要是操作數據庫,這里不累述,通過是partial來擴展,只是做一件事,由于我們的數據庫用的SQLite,可以在實例化過程中通過自定義連接選擇不同的數據庫問文件,只要數據庫里有上篇里面的表即可。我們這里做法是把表放在一個固定的數據庫模版里面,在需要使用的時候,根據模版數據庫文件,復制到指定的地方作為自己的擴展數據庫用。在我們的這個例子里是根據一個sitekey的變量來創建不同的數據庫文件。
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 | public partial class MiniSiteDataExtensionsEntities????{????????/// <summary>????????/// 根據站點sitekey獲取站點擴展信息數據庫實例????????/// </summary>????????/// <param name="sitekey"></param>????????/// <returns></returns>????????public static MiniSiteDataExtensionsEntities GetContext(string sitekey)????????{????????????if(String.IsNullOrEmpty(sitekey))????????????????throw new WeixinException("必選參數sitekey為空");????????????SiteMsg site = SiteMsg.GetSiteMsg(sitekey);????????????return MiniSiteDataExtensionsEntities.GetContext(site.SiteUnid);????????}????????/// <summary>????????/// 根據站點的id獲取站點的擴展信息數據庫實例????????/// </summary>????????/// <param name="siteUnid"></param>????????/// <returns></returns>????????public static MiniSiteDataExtensionsEntities GetContext(Guid siteUnid)????????{????????????string efConStr =?"metadata=~/App_Data/Models/DataExtensions/MiniSiteDataExtensionsModel.csdl|~/App_Data/Models/DataExtensions/MiniSiteDataExtensionsModel.ssdl|~/App_Data/Models/DataExtensions/MiniSiteDataExtensionsModel.msl;provider=System.Data.SQLite.EF6;provider connection string=\"Data Source={0};BinaryGUID=False\"";????????????if (Guid.Empty.Equals(siteUnid))????????????????throw new WeixinException("沒有傳入正確的siteUnid");????????????string appPath = System.AppDomain.CurrentDomain.BaseDirectory;????????????string data_template = appPath +?"X\\minisite_extensions_template.db";????????????if (HttpContext.Current !=?null)????????????{????????????????data_template = HttpContext.Current.Server.MapPath("~/app_data/X/minisite_extensions_template.db");????????????}????????????string siteDir = SiteMsg.GetSiteDataDirectory(siteUnid);????????????string site_data = Path.Combine(siteDir,?"minisite_extensions.db");????????????if (!Directory.Exists(siteDir))????????????????Directory.CreateDirectory(siteDir);????????????if (!File.Exists(site_data))????????????????File.Copy(data_template, site_data);????????????return new MiniSiteDataExtensionsEntities(String.Format(efConStr, site_data));????????}????????public MiniSiteDataExtensionsEntities(string connStr):base(connStr)????????{????????}????} | 
?
總結
以上是生活随笔為你收集整理的基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: .netcore 分布式事务CAP2.6
 - 下一篇: 基于SQLite+EF6实现一套自己的K