private IMongoDatabase GetDatabase(IDatabaseSettings dbSettings) { IMongoDatabase database = null; _databaseLocker.EnterReadLock(); try { if (Databases.ContainsKey(dbSettings.DatabaseName)) { database = Databases[dbSettings.DatabaseName]; } else { _databaseLocker.ExitReadLock(); _databaseLocker.EnterWriteLock(); try { if (!MongoClients.ContainsKey(dbSettings.ConnectionString)) { database = GetClient(dbSettings.ConnectionString).GetDatabase(dbSettings.DatabaseName); Databases.Add(dbSettings.ConnectionString, database); } database = Databases[dbSettings.ConnectionString]; } finally { _databaseLocker.ExitWriteLock(); } } } finally { if (_databaseLocker.IsReadLockHeld) { _databaseLocker.ExitReadLock(); } } return(database); }
private MongoClient GetClient(string connectionString) { MongoClient client = null; _clientLocker.EnterReadLock(); try { if (MongoClients.ContainsKey(connectionString)) { client = MongoClients[connectionString]; } else { _clientLocker.ExitReadLock(); _clientLocker.EnterWriteLock(); try { if (!MongoClients.ContainsKey(connectionString)) { client = new MongoClient(connectionString); MongoClients.Add(connectionString, client); } client = MongoClients[connectionString]; } finally { _clientLocker.ExitWriteLock(); } } } finally { if (_clientLocker.IsReadLockHeld) { _clientLocker.ExitReadLock(); } } return(client); }