public ConfigManager(IConfigFactory configFactory)
        {
            _configFactory = configFactory;

            _globalConfigData = JsonConfigReader.Read(GlobalConfigFilename); // read the global config data.
            PoolConfigs = new List<IPoolConfig>();
            _coinConfigs =  new Dictionary<string, ICoinConfig>();

            LogConfig = new LogConfig(_globalConfigData.logging);
            WebServerConfig = new WebServerConfig(_globalConfigData.website);

            // TODO: implement metrics config.
        }
        private void LoadGlobalConfig()
        {
            var data = _jsonConfigReader.Read(GlobalConfigFilename); // read the global config data.

            // make sure we were able to load global config.
            if (data == null)
            {
                // gracefully exit
                _logger.Error("Couldn't read config/config.json! Make sure you rename config/config-example.json as config/config.json.");
                Environment.Exit(-1);
            }

            // load log config.
            LogConfig = new LogConfig(data.logging); // read the log config first, so rest of the config loaders can use log subsystem.
            _logManager.EmitConfiguration(LogConfig); // assign the log configuration to log manager.

            // print a version banner.
            _logger.Information("CoiniumServ {0:l} {1:l} warming-up..", VersionInfo.CodeName, Assembly.GetAssembly(typeof(Program)).GetName().Version);
            PlatformManager.PrintPlatformBanner();

            // load rest of the configs.
            StackConfig = new StackConfig(data.stack);
            StatisticsConfig = new StatisticsConfig(data.statistics);
            WebServerConfig = new WebServerConfig(data.website);
        }