예제 #1
0
        /// <summary>
        /// 创建一个新的 <see cref="DbConnection"/> 对象。
        /// </summary>
        /// <param name="database"><see cref="IDatabase"/> 对象。</param>
        /// <param name="mode">分布式模式。</param>
        /// <returns><paramref name="database"/> 创建的 <see cref="DbConnection"/> 对象。</returns>
        public static DbConnection CreateConnection(this IDatabase database, DistributedMode mode = DistributedMode.Master)
        {
            Guard.ArgumentNull(database, nameof(database));

            ConnectionString connStr = null;

            if (mode == DistributedMode.Slave && database is IDistributedDatabase distDb)
            {
                connStr = DistributedConnectionManager.GetConnection(distDb);
            }

            return(database.Provider.CreateConnection((connStr ?? database.ConnectionString).ToString()));
        }
예제 #2
0
        private DbConnection GetConnection(DistributedMode mode = DistributedMode.Master)
        {
            if (Transaction != null)
            {
                return(Transaction.Connection);
            }
            else
            {
                var connection = TransactionScopeConnections.GetConnection(this);
                if (connection != null)
                {
                    return(connection);
                }

                var isNew = false;

                if (mode == DistributedMode.Slave)
                {
                    if (connSlave == null)
                    {
                        connection = connSlave = Provider.PrepareConnection(this.CreateConnection(mode));
                        isNew      = true;
                    }
                    else
                    {
                        connection = connSlave;
                    }
                }
                else if (mode == DistributedMode.Master)
                {
                    if (connMaster == null)
                    {
                        connection = connMaster = Provider.PrepareConnection(this.CreateConnection(mode));
                        isNew      = true;
                    }
                    else
                    {
                        connection = connMaster;
                    }
                }

                if (isNew)
                {
                    connection.StateChange += (o, e) => OnConnectionStateChanged(e.OriginalState, e.CurrentState);
                }

                return(connection);
            }
        }
예제 #3
0
        /// <summary>
        /// 创建一个新的 <see cref="DbConnection"/> 对象。
        /// </summary>
        /// <param name="database"><see cref="IDatabase"/> 对象。</param>
        /// <param name="mode">分布式模式。</param>
        /// <returns><paramref name="database"/> 创建的 <see cref="DbConnection"/> 对象。</returns>
        public static DbConnection CreateConnection(this IDatabase database, DistributedMode mode = DistributedMode.Master)
        {
            Guard.ArgumentNull(database, nameof(database));

            ConnectionString connStr = null;

            if (mode == DistributedMode.Slave && database is IDistributedDatabase distDb &&
                distDb.DistributedConnectionStrings != null && distDb.DistributedConnectionStrings.Count > 0)
            {
                var serviceProvider = database.TryGetServiceProvider();
                var manager         = serviceProvider.TryGetService(() => DefaultDistributedConnectionManager.Instance);

                connStr = manager.GetConnection(distDb);
            }

            return(database.Provider.CreateConnection((connStr ?? database.ConnectionString).ToString()));
        }
예제 #4
0
 private void UsingConnection(Action <DbConnection> callback, bool isAutoOpen = true, DistributedMode mode = DistributedMode.Master)
 {
     if (callback != null)
     {
         var connection = GetConnection(mode);
         connection.TryOpen(isAutoOpen);
         callback(connection);
     }
 }
예제 #5
0
        private T UsingConnection <T>(Func <DbConnection, T> callback, bool isAutoOpen = true, DistributedMode mode = DistributedMode.Master)
        {
            var result = default(T);

            if (callback != null)
            {
                var connection = GetConnection(mode);
                connection.TryOpen(isAutoOpen);
                result = callback(connection);
            }

            return(result);
        }
예제 #6
0
        private async Task <T> UsingConnectionAsync <T>(Func <DbConnection, Task <T> > callback, bool isAutoOpen = true, DistributedMode mode = DistributedMode.Master, CancellationToken cancellationToken = default)
        {
            if (callback != null)
            {
                var connection = GetConnection(mode);
                await connection.TryOpenAsync(isAutoOpen, cancellationToken);

                return(await callback(connection));
            }

            return(default(T));
        }