public DatabaseConnectionFactory(IDbConnectionFactory dbConnectionFactory, IDbCommandFactory dbCommandFactory,
		                                 IDatabaseConnectionCache databaseConnectionCache)
        {
            Guard.AgainstNull(dbConnectionFactory, "dbConnectionFactory");
            Guard.AgainstNull(dbCommandFactory, "dbCommandFactory");
            Guard.AgainstNull(databaseConnectionCache, "databaseConnectionCache");

            _dbConnectionFactory = dbConnectionFactory;
            _databaseConnectionCache = databaseConnectionCache;
            _dbCommandFactory = dbCommandFactory;

            _log = Log.For(this);
        }
        public DatabaseConnection(DataSource dataSource, IDbConnection connection, IDbCommandFactory dbCommandFactory, 
            IDatabaseConnectionCache databaseConnectionCache, bool ownedConnection = true, IDbTransaction currentTransaction = null)
        {
            Guard.AgainstNull(dataSource, "dataSource");
            Guard.AgainstNull(connection, "connection");
            Guard.AgainstNull(dbCommandFactory, "dbCommandFactory");
            Guard.AgainstNull(databaseConnectionCache, "databaseConnectionCache");

            _dataSource = dataSource;
            _dbCommandFactory = dbCommandFactory;
            _databaseConnectionCache = databaseConnectionCache;

            Connection = connection;
            _ownedConnection = ownedConnection;
            Transaction = currentTransaction;
            _ownedTransaction = currentTransaction == null;

            _log = Log.For(this);

            _log.Verbose(string.Format(DataResources.DbConnectionCreated, dataSource.Name));

            try
            {
                if (connection.State == ConnectionState.Closed)
                {
                    Connection.Open();
                    _log.Verbose(string.Format(DataResources.DbConnectionOpened, dataSource.Name));
                }
                else
                {
                    _log.Verbose(string.Format(DataResources.DbConnectionAlreadyOpen, dataSource.Name));
                }
            }
            catch (Exception ex)
            {
                _log.Error(string.Format(DataResources.DbConnectionOpenException, dataSource.Name, ex.Message));

                throw;
            }

            databaseConnectionCache.Add(dataSource, this);
        }