using System; using System.Dynamic; using System.Reflection; using System.Runtime.CompilerServices; using Newtonsoft.Json; [assembly: InternalsVisibleTo("deployment.tests")] namespace greyn.Deployment { public static class Configurator where T : new() { private const string confpath = "appsettings.json"; private static FileSystemWatcher appsettingsWatcher = new FileSystemWatcher("."); public static event EventHandler Changed; public static event System.IO.ErrorEventHandler Error; private static T config; public static T Load() { if (File.Exists(confpath)) { /* * if the configuration expects new values we write them in. * if you left other junk for whatever reason, get rekt */ config = JsonConvert.DeserializeObject(File.ReadAllText(confpath)) ?? new T(); } else { config = new T(); } File.WriteAllText(confpath, JsonConvert.SerializeObject(config, Formatting.Indented)); appsettingsWatcher.Filter = confpath; appsettingsWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size; appsettingsWatcher.Changed += internalOnChanged; appsettingsWatcher.Created += internalOnChanged; appsettingsWatcher.Deleted += internalOnChanged; appsettingsWatcher.Renamed += internalOnChanged; appsettingsWatcher.Error += Error; appsettingsWatcher.EnableRaisingEvents = true; return config; } internal static void internalOnChanged(object sender, FileSystemEventArgs e) { appsettingsWatcher.EnableRaisingEvents = false; Load(); Changed(sender, new ConfigChangedEventArgs(){NewConfig = config}); } //I would like to just pudate the values on our held reference, but we'd have to update each value by reflection. //2lazy. public class ConfigChangedEventArgs : EventArgs { public T NewConfig; } } }