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