/// <summary> /// Default Cotr. /// </summary> /// <param name="config">Cache config</param> /// <param name="logger">Logger</param> /// <param name="connectionGenerator">Accepts ConnectionType (first argument) and /// ConnectionString (second argument) as input and returns an instance of DB connection (Must NOT be Opened). /// <para>Both ConnectionType and ConnectionString are exactly what mentioned in DbProfile Config.</para></param> public AsyncCacheMgr(IAsyncCacheConfig config, ILog logger, Func <string, string, DbConnection> connectionGenerator) { config.ThrowIfNull($"{nameof(AsyncCacheMgr)}.{nameof(config)}"); logger.ThrowIfNull($"{nameof(AsyncCacheMgr)}.{nameof(logger)}"); connectionGenerator.ThrowIfNull($"{nameof(AsyncCacheMgr)}.{nameof(connectionGenerator)}"); config.Validate(); _maxConcurrency = StaticCalls.AdjustMaxConcurrency(config.MaxConcurrency); var connectionBlocker = new BlockingCollection <string>(_maxConcurrency); for (var i = 0; i < _maxConcurrency; i++) { connectionBlocker.Add("DB" + i); } _cacheProfiles = config.CacheProfiles.Validate(); _initInputBuilder = new InitInputBuilder { DatabaseProfiles = config.DbProfiles.Validate(), ReloadProfiles = config.ReloadProfiles.Validate(), SerializationProfiles = config.SerializationProfiles.Validate(), LocalCacheFolder = config.CacheLocalFolder.ToDirectoryInfo(), ConnectionBlocker = connectionBlocker, ConnectionGenerator = connectionGenerator, Logger = logger, Token = _cts.Token }; _cacheCollection = new ConcurrentQueue <IAsyncCache>(); _cacheDictionary = new ConcurrentDictionary <Type, object>(); }