Skip to content

Commit e5e49b4

Browse files
committed
Refactoring
1 parent 839cfb5 commit e5e49b4

18 files changed

+107
-118
lines changed

src/NHibernate.Test/Async/MultiTenancy/DatabaseStrategyNoDbSpecificFixture.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
using System.Runtime.Serialization.Formatters.Binary;
1717
using NHibernate.Cfg;
1818
using NHibernate.Cfg.MappingSchema;
19-
using NHibernate.Connection;
2019
using NHibernate.Dialect;
2120
using NHibernate.Driver;
2221
using NHibernate.Engine;
@@ -199,10 +198,7 @@ private IStatelessSession OpenTenantStatelessSession(string tenantId)
199198

200199
private TenantConfiguration GetTenantConfig(string tenantId)
201200
{
202-
return new TestTenantConfiguration(tenantId, IsSqlServerDialect)
203-
{
204-
ConnectionString = Sfi.ConnectionProvider.GetConnectionString()
205-
};
201+
return new TestTenantConfiguration(tenantId, IsSqlServerDialect);
206202
}
207203

208204
private bool IsSqlServerDialect => Sfi.Dialect is MsSql2000Dialect && !(Sfi.ConnectionProvider.Driver is OdbcDriver);
@@ -227,7 +223,7 @@ protected override HbmMapping GetMappings()
227223
protected override DbConnection OpenConnectionForSchemaExport()
228224
{
229225
return Sfi.Settings.MultiTenancyConnectionProvider
230-
.GetConnectionAccess(GetTenantConfig("defaultTenant")).GetConnection(Sfi.ConnectionProvider);
226+
.GetConnectionAccess(GetTenantConfig("defaultTenant"), Sfi).GetConnection();
231227
}
232228

233229
protected override ISession OpenSession()

src/NHibernate.Test/MultiTenancy/DatabaseStrategyNoDbSpecificFixture.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using System.Runtime.Serialization.Formatters.Binary;
77
using NHibernate.Cfg;
88
using NHibernate.Cfg.MappingSchema;
9-
using NHibernate.Connection;
109
using NHibernate.Dialect;
1110
using NHibernate.Driver;
1211
using NHibernate.Engine;
@@ -38,9 +37,7 @@ protected override void Configure(Configuration configuration)
3837
[Test]
3938
public void ShouldThrowWithNoTenantIdentifier()
4039
{
41-
var sessionBuilder = Sfi.WithOptions().TenantConfiguration(new TenantConfiguration(null));
42-
43-
Assert.That(() => sessionBuilder.OpenSession(), Throws.ArgumentException);
40+
Assert.Throws<ArgumentNullException>(() => Sfi.WithOptions().TenantConfiguration(new TenantConfiguration(null)));
4441
}
4542

4643
[Test]
@@ -63,9 +60,7 @@ public void DifferentConnectionStringForDifferentTenants()
6360
[Test]
6461
public void StatelessSessionShouldThrowWithNoTenantIdentifier()
6562
{
66-
var sessionBuilder = Sfi.WithStatelessOptions().TenantConfiguration(new TenantConfiguration(null));
67-
68-
Assert.That(() => sessionBuilder.OpenStatelessSession(), Throws.ArgumentException);
63+
Assert.Throws<ArgumentNullException>(() => Sfi.WithStatelessOptions().TenantConfiguration(new TenantConfiguration(null)));
6964
}
7065

7166
[Test]
@@ -272,10 +267,7 @@ private IStatelessSession OpenTenantStatelessSession(string tenantId)
272267

273268
private TenantConfiguration GetTenantConfig(string tenantId)
274269
{
275-
return new TestTenantConfiguration(tenantId, IsSqlServerDialect)
276-
{
277-
ConnectionString = Sfi.ConnectionProvider.GetConnectionString()
278-
};
270+
return new TestTenantConfiguration(tenantId, IsSqlServerDialect);
279271
}
280272

281273
private bool IsSqlServerDialect => Sfi.Dialect is MsSql2000Dialect && !(Sfi.ConnectionProvider.Driver is OdbcDriver);
@@ -300,7 +292,7 @@ protected override HbmMapping GetMappings()
300292
protected override DbConnection OpenConnectionForSchemaExport()
301293
{
302294
return Sfi.Settings.MultiTenancyConnectionProvider
303-
.GetConnectionAccess(GetTenantConfig("defaultTenant")).GetConnection(Sfi.ConnectionProvider);
295+
.GetConnectionAccess(GetTenantConfig("defaultTenant"), Sfi).GetConnection();
304296
}
305297

306298
protected override ISession OpenSession()
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
using System;
22
using System.Data.SqlClient;
3+
using NHibernate.Connection;
4+
using NHibernate.Engine;
35
using NHibernate.MultiTenancy;
46

57
namespace NHibernate.Test.MultiTenancy
68
{
79
[Serializable]
8-
public class TestMultiTenancyConnectionProvider : DefaultMultiTenancyConnectionProvider
10+
public class TestMultiTenancyConnectionProvider : AbstractMultiTenancyConnectionProvider
911
{
10-
protected override string GetTenantConnectionString(TenantConfiguration configuration)
12+
protected override string GetTenantConnectionString(TenantConfiguration configuration, ISessionFactoryImplementor sessionFactory)
1113
{
1214
return configuration is TestTenantConfiguration tenant && tenant.IsSqlServerDialect
13-
? new SqlConnectionStringBuilder(configuration.ConnectionString) {ApplicationName = configuration.TenantIdentifier}.ToString()
14-
: base.GetTenantConnectionString(configuration);
15+
? new SqlConnectionStringBuilder(sessionFactory.ConnectionProvider.GetConnectionString()) {ApplicationName = configuration.TenantIdentifier}.ToString()
16+
: sessionFactory.ConnectionProvider.GetConnectionString();
1517
}
1618
}
1719
}

src/NHibernate/AdoNet/ConnectionManager.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public DbConnection Close()
165165
if (_backupConnection != null)
166166
{
167167
_log.Warn("Backup connection was still defined at time of closing.");
168-
_connectionAccess.CloseConnection(_backupConnection, Factory.ConnectionProvider);
168+
_connectionAccess.CloseConnection(_backupConnection);
169169
_backupConnection = null;
170170
}
171171

@@ -222,7 +222,7 @@ public DbConnection Disconnect()
222222

223223
private void CloseConnection()
224224
{
225-
_connectionAccess.CloseConnection(_connection, Factory.ConnectionProvider);
225+
_connectionAccess.CloseConnection(_connection);
226226
_connection = null;
227227
}
228228

@@ -256,7 +256,7 @@ public DbConnection GetConnection()
256256
{
257257
if (_ownConnection)
258258
{
259-
_connection = _connectionAccess.GetConnection(Factory.ConnectionProvider);
259+
_connection = _connectionAccess.GetConnection();
260260
// Will fail if the connection is already enlisted in another transaction.
261261
// Probable case: nested transaction scope with connection auto-enlistment enabled.
262262
// That is an user error.

src/NHibernate/Async/AdoNet/ConnectionManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ async Task<DbConnection> InternalGetConnectionAsync()
6161
{
6262
if (_ownConnection)
6363
{
64-
_connection = await (_connectionAccess.GetConnectionAsync(Factory.ConnectionProvider, cancellationToken)).ConfigureAwait(false);
64+
_connection = await (_connectionAccess.GetConnectionAsync(cancellationToken)).ConfigureAwait(false);
6565
// Will fail if the connection is already enlisted in another transaction.
6666
// Probable case: nested transaction scope with connection auto-enlistment enabled.
6767
// That is an user error.

src/NHibernate/Async/Connection/IConnectionAccess.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ namespace NHibernate.Connection
1717
public partial interface IConnectionAccess
1818
{
1919
//ObtainConnection in hibernate
20-
Task<DbConnection> GetConnectionAsync(IConnectionProvider provider, CancellationToken cancellationToken);
20+
Task<DbConnection> GetConnectionAsync(CancellationToken cancellationToken);
2121
}
2222
}

src/NHibernate/Async/Impl/NonContextualConnectionAccess.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System;
1212
using System.Data.Common;
1313
using NHibernate.Connection;
14+
using NHibernate.Engine;
1415

1516
namespace NHibernate.Impl
1617
{
@@ -19,13 +20,13 @@ namespace NHibernate.Impl
1920
partial class NonContextualConnectionAccess : IConnectionAccess
2021
{
2122

22-
public Task<DbConnection> GetConnectionAsync(IConnectionProvider provider, CancellationToken cancellationToken)
23+
public Task<DbConnection> GetConnectionAsync(CancellationToken cancellationToken)
2324
{
2425
if (cancellationToken.IsCancellationRequested)
2526
{
2627
return Task.FromCanceled<DbConnection>(cancellationToken);
2728
}
28-
return provider.GetConnectionAsync(ConnectionString, cancellationToken);
29+
return _sessionFactory.ConnectionProvider.GetConnectionAsync(cancellationToken);
2930
}
3031
}
3132
}

src/NHibernate/Async/MultiTenancy/DefaultMultiTenancyConnectionProvider.cs renamed to src/NHibernate/Async/MultiTenancy/AbstractMultiTenancyConnectionProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@
1111
using System;
1212
using System.Data.Common;
1313
using NHibernate.Connection;
14-
using Environment = NHibernate.Cfg.Environment;
14+
using NHibernate.Engine;
1515

1616
namespace NHibernate.MultiTenancy
1717
{
1818
using System.Threading.Tasks;
1919
using System.Threading;
20-
public partial class DefaultMultiTenancyConnectionProvider : IMultiTenancyConnectionProvider
20+
public abstract partial class AbstractMultiTenancyConnectionProvider : IMultiTenancyConnectionProvider
2121
{
2222
partial class ContextualConnectionAccess : IConnectionAccess
2323
{
2424

25-
public Task<DbConnection> GetConnectionAsync(IConnectionProvider provider, CancellationToken cancellationToken)
25+
public Task<DbConnection> GetConnectionAsync(CancellationToken cancellationToken)
2626
{
2727
if (cancellationToken.IsCancellationRequested)
2828
{
2929
return Task.FromCanceled<DbConnection>(cancellationToken);
3030
}
31-
return provider.GetConnectionAsync(ConnectionString, cancellationToken);
31+
return _sessionFactory.ConnectionProvider.GetConnectionAsync(ConnectionString, cancellationToken);
3232
}
3333
}
3434
}

src/NHibernate/Cfg/Environment.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,12 +389,12 @@ public static string Version
389389
/// <summary>
390390
/// Strategy for multi-tenancy. </summary>
391391
/// <seealso cref="MultiTenancyStrategy"/>
392-
public const string MultiTenancy = "multiTenancy";
392+
public const string MultiTenancy = "multi_tenancy.strategy";
393393

394394
/// <summary>
395395
/// Connection provider for given multi-tenancy strategy. Class name implementing IMultiTenancyConnectionProvider.
396396
/// </summary>
397-
public const string MultiTenancyConnectionProvider = "multiTenancy.connection_provider";
397+
public const string MultiTenancyConnectionProvider = "multi_tenancy.connection_provider";
398398

399399
private static IBytecodeProvider BytecodeProviderInstance;
400400
private static bool EnableReflectionOptimizer;

src/NHibernate/Cfg/SettingsFactory.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -426,13 +426,12 @@ private static IMultiTenancyConnectionProvider CreateMultiTenancyConnectionProvi
426426
Environment.MultiTenancyConnectionProvider,
427427
properties,
428428
null);
429+
log.Info("Multi-tenancy connection provider: {0}", className);
429430
if (className == null)
430431
{
431-
log.Info("Default Multi-tenancy connection provider is used: {0}", typeof(DefaultMultiTenancyConnectionProvider).FullName);
432-
return new DefaultMultiTenancyConnectionProvider();
432+
return null;
433433
}
434434

435-
log.Info("Multi-tenancy connection provider: {0}", className);
436435
try
437436
{
438437
return (IMultiTenancyConnectionProvider)

src/NHibernate/Connection/IConnectionAccess.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@ namespace NHibernate.Connection
1111
public partial interface IConnectionAccess
1212
{
1313
//ObtainConnection in hibernate
14-
DbConnection GetConnection(IConnectionProvider provider);
14+
DbConnection GetConnection();
1515

1616
//ReleaseConnection in hibernate
17-
void CloseConnection(DbConnection conn, IConnectionProvider provider);
18-
19-
string ConnectionString { get; }
17+
void CloseConnection(DbConnection conn);
2018
}
2119
}

src/NHibernate/Impl/AbstractSessionImpl.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,14 @@ private TenantConfiguration ValidateTenantConfiguration(ISessionFactoryImplement
6868

6969
if (string.IsNullOrEmpty(tenantConfiguration?.TenantIdentifier))
7070
{
71-
throw new ArgumentException("Tenant configuration with TenantIdentifier defined is required for multi-tenancy.", nameof(tenantConfiguration));
71+
throw new ArgumentException("Tenant configuration with TenantIdentifier defined is required for multi-tenancy.", nameof(tenantConfiguration));
72+
}
73+
74+
if (_factory.Settings.MultiTenancyConnectionProvider == null)
75+
{
76+
throw new ArgumentException(
77+
$"IMultiTenantConnectionProvider is required for multi-tenancy. Provide it via '{Cfg.Environment.MultiTenancyConnectionProvider}` session factory setting.",
78+
nameof(tenantConfiguration));
7279
}
7380

7481
return tenantConfiguration;
@@ -104,8 +111,8 @@ protected internal AbstractSessionImpl(ISessionFactoryImplementor factory, ISess
104111
options.SessionConnectionReleaseMode,
105112
Interceptor,
106113
_tenantConfiguration == null
107-
? new NonContextualConnectionAccess(_factory.ConnectionProvider.GetConnectionString())
108-
: _factory.Settings.MultiTenancyConnectionProvider.GetConnectionAccess(_tenantConfiguration),
114+
? new NonContextualConnectionAccess(_factory)
115+
: _factory.Settings.MultiTenancyConnectionProvider.GetConnectionAccess(_tenantConfiguration, _factory),
109116
options.ShouldAutoJoinTransaction);
110117
}
111118
}
Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
using System;
22
using System.Data.Common;
33
using NHibernate.Connection;
4+
using NHibernate.Engine;
45

56
namespace NHibernate.Impl
67
{
78
[Serializable]
89
partial class NonContextualConnectionAccess : IConnectionAccess
910
{
10-
public NonContextualConnectionAccess(string connectionString)
11+
private readonly ISessionFactoryImplementor _sessionFactory;
12+
13+
public NonContextualConnectionAccess(ISessionFactoryImplementor connectionProvider)
1114
{
12-
ConnectionString = connectionString;
15+
_sessionFactory = connectionProvider;
1316
}
1417

15-
public DbConnection GetConnection(IConnectionProvider provider)
18+
public DbConnection GetConnection()
1619
{
17-
return provider.GetConnection(ConnectionString);
20+
return _sessionFactory.ConnectionProvider.GetConnection();
1821
}
1922

20-
public void CloseConnection(DbConnection conn, IConnectionProvider provider)
23+
public void CloseConnection(DbConnection conn)
2124
{
22-
provider.CloseConnection(conn);
25+
_sessionFactory.ConnectionProvider.CloseConnection(conn);
2326
}
24-
25-
public string ConnectionString { get; }
2627
}
2728
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Data.Common;
3+
using NHibernate.Connection;
4+
using NHibernate.Engine;
5+
6+
namespace NHibernate.MultiTenancy
7+
{
8+
/// <summary>
9+
/// Base implementation for multi-tenancy strategy.
10+
/// </summary>
11+
[Serializable]
12+
public abstract partial class AbstractMultiTenancyConnectionProvider : IMultiTenancyConnectionProvider
13+
{
14+
/// <inheritdoc />
15+
public IConnectionAccess GetConnectionAccess(TenantConfiguration configuration, ISessionFactoryImplementor sessionFactory)
16+
{
17+
var tenantConnectionString = GetTenantConnectionString(configuration, sessionFactory);
18+
if (string.IsNullOrEmpty(tenantConnectionString))
19+
{
20+
throw new HibernateException($"Tenant '{configuration.TenantIdentifier}' connection string is empty.");
21+
}
22+
23+
return new ContextualConnectionAccess(tenantConnectionString, sessionFactory);
24+
}
25+
26+
protected abstract string GetTenantConnectionString(TenantConfiguration configuration, ISessionFactoryImplementor sessionFactory);
27+
28+
[Serializable]
29+
partial class ContextualConnectionAccess : IConnectionAccess
30+
{
31+
private readonly ISessionFactoryImplementor _sessionFactory;
32+
33+
public ContextualConnectionAccess(string connectionString, ISessionFactoryImplementor sessionFactory)
34+
{
35+
ConnectionString = connectionString;
36+
_sessionFactory = sessionFactory;
37+
}
38+
39+
public string ConnectionString { get; }
40+
41+
public DbConnection GetConnection()
42+
{
43+
return _sessionFactory.ConnectionProvider.GetConnection(ConnectionString);
44+
}
45+
46+
public void CloseConnection(DbConnection conn)
47+
{
48+
_sessionFactory.ConnectionProvider.CloseConnection(conn);
49+
}
50+
}
51+
}
52+
}

0 commit comments

Comments
 (0)