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

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

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

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

    前面两边的代码就是一套初步的工具包架构,基本底层通用,可以移植到任意项目实现类似的需求.接下来,再在我们特定的项目几微助手里面再实现一套基于自己项目的基类,根据项目需求抽象一下项目内的常用方法.理论上 ...

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

    在项目中,经常会需要对一些特定的业务对象进行属性的扩展,而且这些属性的扩展还具备极不可预测性.相互关系松散等特点.大部分的开发人员是最讨厌这类涉及到数据字段扩展的需求变更.这种调整,轻则数据要加字段, ...

  3. 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

    基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socketserver = socket.socket(socket.AF_INET,socket.S ...

  4. sqlite c++插入 timestamp_Dqlite,基于sqlite 高可用(HA)数据库

    原文发表于我的博客, 特此版权声明 noosphere.site: Dqlite,基于sqlite 高可用(HA)数据库 csdn : Dqlite,基于sqlite 高可用(HA)数据库 k3s之前 ...

  5. mysql sqlite 分页查询_php基于SQLite实现的分页功能示例

    本文实例讲述了php基于SQLite实现的分页功能.分享给大家供大家参考,具体如下: 这里操作数据库文件使用的是前面文章<PHP基于PDO实现的SQLite操作类[包含增删改查及事务等操作]&g ...

  6. 基于嗅探原理的原始套接字木马

    首先我们说说现有木马的特点和功能.早期木马一般都是基于TCP连接的,现在这种木马的生存能力 非常有限,因为直接基于连接的木马很容易被拦截或者发现.然后有通过改变协议来实现通讯隐藏的木马, 比如采用UD ...

  7. C# 错误 175: 具有固定名称“System.Data.SQLite.EF6”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载

    进入C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config找到machine.config 在configuration -> system ...

  8. 人效提高350%,基于KICP搭建的营销套电客服机器人,让欧派家居赢在起点

    当前,90后甚至部分00后成为了家居消费的主力军.生活节奏一再加快,使人们获取信息的习惯发生了转变,更多的消费者不再直奔家居建材城咨询选购,而是选择在购买家居产品之前,通过线上渠道先行了解. 消费者的 ...

  9. 2021年基于VUE开发的一套移动端APP小说 听书AI男女多种 支持云端存储书籍记录

    2021年基于VUE开发的一套移动端APP小说 前端架构主要采用: "axios": "^0.21.1", "better-scroll": ...

最新文章

  1. PyTorch 1.6正式发布!新增自动混合精度训练、Windows版开发维护权移交微软
  2. Apache POI和EasyExcel 第七集:EasyExcel的基本操作,读取和写入Excel,一行足矣
  3. sql2000数据库置疑
  4. crontab 用法
  5. aswing JTable用法
  6. ruby-gems 常用命令笔记
  7. docker 网络设置
  8. 替换Android中VM 加载动态库方式
  9. C语言经典题目(51-60)
  10. ZigBee模块学习
  11. 在excel中创建日历
  12. 自己封装的一个checkbook工具
  13. [4G5G专题-46]:物理层-自适应编码调制AMC与调制编码方案(MCS, CQI, SINR, HARQ,Code Rate, efficiency)
  14. 动漫,简史早期的日本动画
  15. 第二次作业,制作调查问卷
  16. uniapp 下拉列表插件 lable问题
  17. 计算机三级网络技术最全知识点总结一
  18. acrobat 打印PDF时错误:Error: typecheck; OffendingCommand: show
  19. 助力企业实现远程监控故障诊断
  20. 数说故事车企数字化转型案例分享——内容营销如何促进品牌增长

热门文章

  1. 如何在Raspberry Pi上设置两因素身份验证
  2. ios beta 下载_如何回滚到iOS 10(如果您使用的是iOS 11 Beta)
  3. kotlin 初始化数组
  4. 中国版LinkedIn呼之欲出
  5. IROS 2017上,这些厂商将会给我们展示什么样的黑科技?
  6. 小程序 - 学习笔记
  7. 如何用outlook express 收发邮件
  8. Redis主从持久化测试
  9. 基于Prometheus的.NET 4.x应用服务监控
  10. 如何在 Dapper.NET 中使用事务?