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

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

1

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
/// <summary>
   /// 站点设置的基类,基类主要提供站点扩展设置的数据库连接等操作
   /// </summary>
   public abstract class BaseSiteExtensions:BaseExtensions
   {
       public Guid SiteUnid { getset; }
       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的数据文件。)

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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/// <summary>
    /// 站点的扩展设置基类
    /// </summary>
    public class BaseSiteSettingExtensions:BaseSiteExtensions
    {
        public  event ItemSaved OnItemSaved;
        public  event AllItemsSaved OnAllItemsSaved;
        public virtual SettingEditorDictionary EditorItems { getset; }
        protected string TypeName { getset; }
        /// <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数据表是有两个的。一个是模块整体的配置,一个是模块里面单个对象的设置。这个类就是管理前者。

这个就是管理模块单项配置的基类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019-03-09-算法-进化(从排序数组中删除重复项)

题目描述 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1 给定数组 nums…

P6329 【模板】点分树 | 震波

P6329 【模板】点分树 | 震波 这是一道模板题&#xff0c;需要支持两个操作&#xff0c;操作一就是单点修改点权&#xff0c;操作二就是查询距离x不超过k的点权值和。 我们考虑建出点分树&#xff0c;然后对于每个点维护两个数据结构&#xff0c;一个处理当前分治范围到当前点…

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

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

2019-03-09-算法-进化(买卖股票的最佳时机 II)

题目描述 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买…

【C】Natasha V1.3.6.0 的升级日志

文章转载授权级别&#xff1a;C 预计阅读时间&#xff1a;8分钟开源库满足于个人&#xff0c;而完善于大众。Natasha 自稳定版发布之后&#xff0c;众多老铁参与增强改进&#xff0c;感谢如下老铁的反馈&#xff1a;1. 异常搜集在 wenjq0911 建议下&#xff0c;添加…

牛客练习赛69 解方程

解方程 ∑d∣nf(d)σp(nd)σq(n)f∗σpσq有σk∑d∣ndkidk∗If∗idp∗Iidq∗I∑d∣nμ(d)μ∗I对上面式子同时卷上一个μf∗idpidq因为idk是一个完全积性函数&#xff0c;所以idp−1μidpidk∗(μidp)∑d∣ndkμ(nd)(nd)k∑d∣nμ(d)ϵfidq∗(μidp)f(n)∑d∣nμ(d)dp(nd)qf(1…

2019-03-09-算法-进化(旋转数组)

题目描述 给定一个数组&#xff0c;将数组中的元素向右移动 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]示…

.NET 程序员如何学习Vue

之所以取这个标题&#xff0c;是因为本文来自内部培训的整理&#xff0c;培训的对象是公司的 .NET 程序员&#xff0c;.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对接。Vue 是现在比较流行的前端框架&#xff0c;也是非常容易入门的前端框架&#xff0c;…

P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)

P3714 [BJOI2017]树的难题 求解树上长度在L到R的树链中颜色段权值和最大的链。 首先求解树上链的问题&#xff0c;而且限制了链的长度&#xff0c;那么我们需要点分治处理&#xff0c;然后考虑每次分治&#xff0c;我们可以把链分成两类&#xff0c;先处理同色连通块&#xf…

A Simple Math Problem(2020 ICPC 江西省省赛)

A Simple Math Problem ∑i1n∑j1if(j)[gcd(i,j)1]∑i1n∑jinf(i)[gcd(i,j)1]∑i1n∑j1nf(i)[gcd(i,j)1]−∑i1n∑j1if(i)[gcd(i,j)1]f(1)∑d1nμ(d)nd∑i1ndf(id)−∑i1nf(i)ϕ(i)f(1)然后就可以O(nlog⁡n)求解了\sum_{i 1} ^{n} \sum_{j 1} ^{i} f(j)[gcd(i, j) 1]\\ \sum…

2019-03-10-算法-进化(存在重复)

给定一个整数数组&#xff0c;判断是否存在重复元素。 如果任何值在数组中出现至少两次&#xff0c;函数返回 true。如果数组中每个元素都不相同&#xff0c;则返回 false。 示例 1: 输入: [1,2,3,1] 输出: true示例 2: 输入: [1,2,3,4] 输出: false示例 3: 输入: [1,1,1,…

P3233 [HNOI2014]世界树(虚树/倍增/动态规划)

P3233 [HNOI2014]世界树 每次给出mi个点&#xff0c;查询每个点控制的点的个数&#xff0c;每个点由离他最近编号最小的点控制。 首先按照套路建出虚树&#xff0c;注意特判1节点&#xff0c;然后用栈维护右链&#xff0c;然后不断弹栈建边。 然后进行dp&#xff0c;求解出虚…

.Net之微信小程序获取用户UnionID

前言&#xff1a;在实际项目开发中我们经常会遇到账号统一的问题&#xff0c;如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一&#xff08;便于用户信息的管理&#xff09;。这段时间就有一个这样的需求&#xff0c;之前有个客户做了一个微信小程序商城&…

Absolute Math (HDU 6868)

Absolute Math 定义c(n)theprimenhave&#xff0c;c(1)0,c(2)1,c(4)1,c(6)2f(n)∑d∣nμ(d)22c(n)f(ab)f(a)f(b)f(gcd(a,b))∑i1mf(n)f(i)f(gcd(n,i))f(n)∑d∣n1f(d)∑i1mdf(id)[gcd(i,nd)1]f(n)∑d∣n1f(d)∑k∣ndμ(k)∑i1mkdf(ikd)Tkdf(n)∑T∣n∑i1mTf(iT)∑d∣Tμ(Td)f(d…

2019-03-10-算法-进化(只出现一次的数字)

题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1…

自由源自于自律 及其他三则分享

Office 365 官方公众号的新创深度内容推荐竹板这么一打呀&#xff0c;别的咱不夸&#xff0c;单说我们的Office 365官方公众号&#xff08;“微软Office365”&#xff09;&#xff0c;近一段时间来在内容创作上面有一些新的突破——推出了一个关于探讨大脑及思维运作的专题。请…

CF871E Restore the Tree(构造/哈希)

CF871E Restore the Tree 对于一个n个点的树&#xff0c;给定k个点以及这k个点到n个点的距离&#xff0c;然后构造出一颗合法的树。如果不存在合法的树输出-1&#xff0c;任意输出一组解即可。 首先处理在关键点链上的节点&#xff0c;对于两个关键点&#xff0c;有且仅有他们…

Battlestation Operational HDU 6134

Battlestation Operational ∑i1n∑j1i⌈ij⌉[gcd(i,j)1]∑i1n∑j1i(ij1)[gcd(i,j)1]−∑i1n∑j1i[gcd(i,j)1,j∣i]∑i1n∑j1i(ij1)[gcd(i,j)1]−n∑i1n∑j1iij[gcd(i,j)1]∑i1n∑j1i[gcd(i,j)1]−n∑i1n∑j1iij[gcd(i,j)1]∑i1ϕ(i)−n∑i1n∑j1iij[gcd(i,j)1]∑d1nμ(d)∑i1n…

2019-03-11-算法-进化(求众数)

题目描述 给定一个大小为 n 的数组&#xff0c;找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在众数。 示例 1: 输入: [3,2,3] 输出: 3示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2思路&#xff1a…

淘宝商品数据库设计的一些经验

前言这几个月都在做一个通过淘宝API线下管理淘宝店的系统&#xff0c;学习了很多东西&#xff0c;这里想对淘宝商品表设计用自己的想法表现出来&#xff0c;如果你觉得很扯淡&#xff0c;可以写下自己的看法.OK&#xff0c;切入正题.淘宝的商品这块的复杂程度&#xff0c;是我见…