using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Reflection; using ZeroLevel.Services.Config; using ZeroLevel.Services.Config.Implementation; using ZeroLevel.Services.Serialization; namespace ZeroLevel { public static class Configuration { /// /// Путь к каталогу приложения /// public static string BaseDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly()?.CodeBase)?. Replace("file:\\", string.Empty); public static string AppLocation = Assembly.GetEntryAssembly()?.Location; public const string DEFAULT_SECTION_NAME = "_defaultsection"; #region Ctor static Configuration() { _empty = new BaseConfiguration(); _emptySet = new BaseConfigurationSet(); _empty.Freeze(true); _emptySet.FreezeConfiguration(true); } #endregion #region Cachee private static readonly IConfiguration _empty; private static readonly IConfigurationSet _emptySet; private static readonly ConcurrentDictionary _cachee = new ConcurrentDictionary(); private static readonly ConcurrentDictionary _setCachee = new ConcurrentDictionary(); public static IConfiguration Empty { get { return _empty; } } public static IConfigurationSet EmptySet { get { return _emptySet; } } public static IConfiguration Default { get; private set; } public static IConfigurationSet DefaultSet { get; private set; } public static void Save(string name, IConfiguration configuration) { _cachee.AddOrUpdate(name, configuration, (oldKey, oldValue) => configuration); } public static void Save(IConfiguration configuration) { if (Default == null) { Default = configuration; } else { throw new Exception("Default configuration set already"); } } public static void Save(string name, IConfigurationSet configurationSet) { _setCachee.AddOrUpdate(name, configurationSet, (oldKey, oldValue) => configurationSet); } public static void Save(IConfigurationSet configuration) { if (DefaultSet == null) { DefaultSet = configuration; } else { throw new Exception("Default configurationset set already"); } } public static IConfiguration Get(string name) { IConfiguration result; if (false == _cachee.TryGetValue(name, out result)) { throw new KeyNotFoundException(string.Format("Not found configuration '{0}'", name)); } return result; } public static IConfigurationSet GetSet(string name) { IConfigurationSet result; if (false == _setCachee.TryGetValue(name, out result)) { throw new KeyNotFoundException(string.Format("Not found configuration set '{0}'", name)); } return result; } #endregion #region Factory public static IConfiguration Create() { return new BaseConfiguration(); } public static IConfigurationSet CreateSet() { return new BaseConfigurationSet(); } public static IConfigurationSet CreateSet(IConfiguration defaultConfiguration) { return new BaseConfigurationSet(defaultConfiguration); } #endregion #region Read configuration /// /// Создание конфигурации из секции AppSettings файла app.config или web.config /// /// Конфигурация public static IConfiguration ReadFromApplicationConfig() { return new ApplicationConfigReader().ReadConfiguration(); } /// /// Создание конфигурации из секции AppSettings файла app.config или web.config, дополняется секцией 'ConnectionStrings' /// /// Конфигурация public static IConfigurationSet ReadSetFromApplicationConfig() { return new ApplicationConfigReader().ReadConfigurationSet(); } /// /// Создание конфигурации из секции AppSettings файла app.config или web.config /// /// Конфигурация public static IConfiguration ReadFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfiguration(); } /// /// Создание конфигурации из секции AppSettings файла app.config или web.config, дополняется секцией 'ConnectionStrings' /// /// Конфигурация public static IConfigurationSet ReadSetFromApplicationConfig(string configFilePath) { return new ApplicationConfigReader(configFilePath).ReadConfigurationSet(); } /// /// Создание конфигурации из ini файла /// /// Путь к ini-файлу /// Конфигурация public static IConfiguration ReadFromIniFile(string path) { return new IniFileReader(path).ReadConfiguration(); } /// /// Создание конфигурации из ini файла, с учетом секций /// /// Путь к ini-файлу /// Конфигурация public static IConfigurationSet ReadSetFromIniFile(string path) { return new IniFileReader(path).ReadConfigurationSet(); } /// /// Создание конфигурации из параметров командной строки /// /// Параметры командной строки /// Конфигурация public static IConfiguration ReadFromCommandLine(string[] args) { return new CommandLineReader(args).ReadConfiguration(); } public static IConfigurationSet ReadBinary(IBinaryReader reader) { return reader.Read(); } #endregion #region Write configuration /// /// Запись простой конфигурации в ini-файл /// /// Конфигурация /// Путь к ini-файлу public static void WriteToIniFile(IConfiguration configuration, string path) { new IniFileWriter(path).WriteConfiguration(configuration); } /// /// Запись полной конфигурации в ini-файл /// /// Конфигурация /// Путь к ini-файлу public static void WriteSetToIniFile(IConfigurationSet configuration, string path) { new IniFileWriter(path).WriteConfigurationSet(configuration); } #endregion } }