4.2 多级可换源的配置(下)
发布时间:2016-10-29 01:33:45 所属栏目:教程 来源:站长网
导读:副标题#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开发框架目录 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

