上一篇里面整理了一下需求和思路,自定义了扩展的字典对象,这里我们再继续深入编码。
BaseExtensions类,这个类作未来任何需要Key-Value形式扩展的基类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | /// <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的变量来创建不同的数据库文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 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) { } } |