加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

4.2 多级可换源的配置(下)

发布时间:2016-10-29 02:18:16 所属栏目:教程 来源:站长网
导读:副标题#e# 前面已经实现了Json配置源的方式,以及在Startup中注册使用我们的配置源。下面我们进入重点,就是如何实现数据库方式的配置。数据表对应的实体类和DbContext代码如下,就不写数据表的结构了:) 1 public class ConfigurationSectionInfo 2 { 3 pub

DbConfigurationProvider程序的大体流程是:从数据库中读取与本应用(AppCode)相关的配置节,再读取所有应用为空的配置节(缺省配置节),然后所有配置节合并成为一个总的配置字符串,最后调用解析方法生成配置的Key/Value。解析的代码:

 1     public static class JsonConfigurationParser
 2     {
 3         private static IDictionary<string, string> _data;
 4         private static Stack<string> _context;
 5         private static string _currentPath;
 6 
 7         static JsonConfigurationParser()
 8         {
 9             _data = new SortedDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
10             _context = new Stack<string>();
11         }
12 
13         public static IDictionary<string, string> Parse(string configs)
14         {
15             _data.Clear();
16 
17             var jsonConfig = JObject.Parse(configs);
18 
19             VisitJObject(jsonConfig);
20 
21             return _data;
22         }
23 
24         private static void VisitJObject(JObject jObject)
25         {
26             foreach (var property in jObject.Properties())
27             {
28                 EnterContext(property.Name);
29                 VisitProperty(property);
30                 ExitContext();
31             }
32         }
33 
34         private static void VisitProperty(JProperty property)
35         {
36             VisitToken(property.Value);
37         }
38 
39         private static void VisitToken(JToken token)
40         {
41             switch (token.Type)
42             {
43                 case JTokenType.Object:
44                     VisitJObject(token.Value<JObject>());
45                     break;
46 
47                 case JTokenType.Array:
48                     VisitArray(token.Value<JArray>());
49                     break;
50 
51                 case JTokenType.Integer:
52                 case JTokenType.Float:
53                 case JTokenType.String:
54                 case JTokenType.Boolean:
55                 case JTokenType.Bytes:
56                 case JTokenType.Raw:
57                 case JTokenType.Null:
58                     VisitPrimitive(token);
59                     break;
60                 default:
61                     MicroStrutLibraryExceptionHelper.Throw(typeof(JsonConfigurationParser).FullName, LogLevel.Error, "类型不正确!");
62                     break;
63             }
64         }
65 
66         private static void VisitArray(JArray array)
67         {
68             for (int index = 0; index < array.Count; index++)
69             {
70                 EnterContext(index.ToString());
71                 VisitToken(array[index]);
72                 ExitContext();
73             }
74         }
75 
76         private static void VisitPrimitive(JToken data)
77         {
78             var key = _currentPath;
79 
80             MicroStrutLibraryExceptionHelper.TrueThrow(_data.ContainsKey(key), typeof(JsonConfigurationParser).FullName, LogLevel.Error, $"键值{key}重复");
81 
82             _data[key] = data.ToString();
83         }
84 
85         private static void EnterContext(string context)
86         {
87             _context.Push(context);
88             _currentPath = ConfigurationPath.Combine(_context.Reverse());
89         }
90 
91         private static void ExitContext()
92         {
93             _context.Pop();
94             _currentPath = ConfigurationPath.Combine(_context.Reverse());
95         }
96     }

这个解析类的代码基本照.net core的源代码复制而来。

 

面向云的.net core开发框架目录

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读