/// <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())); }
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); } }
/// <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())); }
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); } }
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); }
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)); }