爱摄叽歪

爱生活爱叽歪,一个不务正业的人!

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(2)

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(1)

上一篇里面整理了一下需求和思路,自定义了扩展的字典对象,这里我们再继续深入编码。

BaseExtensions类,这个类作未来任何需要Key-Value形式扩展的基类
基础的字典对象来对应数据的Key-Value字段来做数据的纵向扩展,这里我们需要获取、设置值等常用数据操作方法放到基类。

 /// <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的变量来创建不同的数据库文件。

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)
        {
        }
    }

 

不允许评论