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
|
public abstract class ConfigurationContextBase : IConfigurationContext, IDisposable { private ConfigurationFileSystemWatcher? _watcher; protected ConfigurationContextBase() { this.Reload(); InitWatcher(); } public abstract string GetPersistentPath(); public void Persistent() { System.Configuration.Configuration configuration = GetConfiguration(); PropertyInfo[] propertyInfos = this.GetType().GetProperties(); foreach (var prop in propertyInfos) { InjectItem(configuration, prop); } configuration.Save(ConfigurationSaveMode.Modified); } public void Reload() { System.Configuration.Configuration configuration = GetConfiguration(); PropertyInfo[] propertyInfos = this.GetType().GetProperties(); foreach (var prop in propertyInfos) { ExtractItem(configuration, prop); } }
private void InitWatcher() { Type type = this.GetType(); ConfigurationContextAttribute? configurationContextAttribute = type.GetCustomAttribute<ConfigurationContextAttribute>(); if (configurationContextAttribute == null) { return; } bool isHotload = configurationContextAttribute.IsHotload; if (isHotload) { _watcher = new ConfigurationFileSystemWatcher(this); } } private System.Configuration.Configuration GetConfiguration() { string persistentPath = this.GetPersistentPath(); string? persistentDirectoryPath = Path.GetDirectoryName(persistentPath); if (persistentDirectoryPath == null) { throw new NotSupportedException($"非法路径:{persistentPath}"); } if (!Directory.Exists(persistentDirectoryPath)) { Directory.CreateDirectory(persistentDirectoryPath); } ExeConfigurationFileMap configurationFileMap = new ExeConfigurationFileMap(); configurationFileMap.ExeConfigFilename = persistentPath; System.Configuration.Configuration configObject = ConfigurationManager .OpenMappedExeConfiguration(configurationFileMap, ConfigurationUserLevel.None); return configObject; } private void InjectItem(System.Configuration.Configuration configuration, PropertyInfo prop) { ConfigurationItemAttribute? configurationItemAttribute = prop.GetCustomAttribute<ConfigurationItemAttribute>(); if (configurationItemAttribute == null) { return; } object value = prop.GetValue(this) ?? string.Empty; string key = configurationItemAttribute.Name ?? prop.Name; if (configurationItemAttribute.Encipher != null) { value = configurationItemAttribute .Encipher .Encrypt(value.ToString()); } if (configurationItemAttribute.Converter != null) { value = configurationItemAttribute .Converter .Write(value); } if (configuration.AppSettings.Settings.AllKeys.Contains(key)) { configuration.AppSettings.Settings[key].Value = value.ToString(); } else { configuration.AppSettings.Settings.Add(key, value.ToString()); } } private void ExtractItem(System.Configuration.Configuration configuration, PropertyInfo prop) { ConfigurationItemAttribute? configurationItemAttribute = prop.GetCustomAttribute<ConfigurationItemAttribute>(); if (configurationItemAttribute == null) { return; } string key = configurationItemAttribute.Name ?? prop.Name; object? value = configuration.AppSettings.Settings[key]?.Value; if (configurationItemAttribute.Converter != null) { value = configurationItemAttribute .Converter .Read(value.ToString()); } if (value == null) { return; } if (configurationItemAttribute.Encipher != null) { value = configurationItemAttribute.Encipher.Decrypt(value.ToString()); } object convertedValue = value; prop.SetValue(this, convertedValue); } public void Dispose() { _watcher?.Dispose(); } }
|