Revised multi tenant connection string resolver.

pull/81/head
Halil İbrahim Kalkan 9 years ago
parent 764dc3790b
commit 6989ff05a5

@ -5,6 +5,9 @@ namespace Volo.Abp.Data.MultiTenancy
public interface ITenantConnectionStringStore public interface ITenantConnectionStringStore
{ {
[CanBeNull] [CanBeNull]
string GetConnectionStringOrNull([NotNull] string tenantId, [CanBeNull] string connStringName); string GetDefaultConnectionStringOrNull([NotNull] string tenantId);
[CanBeNull]
string GetConnectionStringOrNull([NotNull] string tenantId, [NotNull] string connStringName);
} }
} }

@ -1,10 +1,10 @@
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.DependencyInjection; using Volo.DependencyInjection;
using Volo.ExtensionMethods.Collections.Generic;
namespace Volo.Abp.Data.MultiTenancy namespace Volo.Abp.Data.MultiTenancy
{ {
//TODO: It would be better to use composition over inheritance on connection string resolve progress!
//TODO: Create a replace service registration convention, instead of custom registration in AbpMultiTenancyModule? //TODO: Create a replace service registration convention, instead of custom registration in AbpMultiTenancyModule?
[DisableConventionalRegistration] [DisableConventionalRegistration]
@ -26,20 +26,40 @@ namespace Volo.Abp.Data.MultiTenancy
public override string Resolve(string connectionStringName = null) public override string Resolve(string connectionStringName = null)
{ {
var tenant = _multiTenancyManager.CurrentTenant; var tenant = _multiTenancyManager.CurrentTenant;
//No current tenant, fallback to default logic
if (tenant == null) if (tenant == null)
{ {
return base.Resolve(connectionStringName); return base.Resolve(connectionStringName);
} }
var connectionString = _tenantConnectionStringStore.GetConnectionStringOrNull(tenant.Id, connectionStringName); //Requesting default connection string
if (connectionString == null) if (connectionStringName == null)
{ {
return base.Resolve(connectionStringName); return _tenantConnectionStringStore.GetDefaultConnectionStringOrNull(tenant.Id) ??
Options.ConnectionStrings.Default;
} }
//TODO: If given tenant did not specified a connectionStringName specific connection string, then use the default connection string for connectionStringName, not tenant's default database //Requesting specific connection string
var connString = _tenantConnectionStringStore.GetConnectionStringOrNull(tenant.Id, connectionStringName);
if (connString != null)
{
return connString;
}
/* Requested a specific connection string, but it's not specified for the tenant.
* - If it's specified in options, use it.
* - If not, use tenant's default conn string.
*/
var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName);
if (connStringInOptions != null)
{
return connStringInOptions;
}
return connectionString; return _tenantConnectionStringStore.GetDefaultConnectionStringOrNull(tenant.Id) ??
Options.ConnectionStrings.Default;
} }
} }
} }

@ -4,6 +4,12 @@ namespace Volo.Abp.Data.MultiTenancy
{ {
public sealed class NullTenantConnectionStringStore : ITenantConnectionStringStore, ISingletonDependency public sealed class NullTenantConnectionStringStore : ITenantConnectionStringStore, ISingletonDependency
{ {
public string GetDefaultConnectionStringOrNull(string tenantId)
{
//No tenant specific connection string by default
return null;
}
public string GetConnectionStringOrNull(string tenantId, string connStringName) public string GetConnectionStringOrNull(string tenantId, string connStringName)
{ {
//No tenant specific connection string by default //No tenant specific connection string by default

@ -7,11 +7,11 @@ namespace Volo.Abp.Data
{ {
public class DefaultConnectionStringResolver : IConnectionStringResolver, ITransientDependency public class DefaultConnectionStringResolver : IConnectionStringResolver, ITransientDependency
{ {
private readonly DbConnectionOptions _options; protected DbConnectionOptions Options { get; }
public DefaultConnectionStringResolver(IOptionsSnapshot<DbConnectionOptions> options) public DefaultConnectionStringResolver(IOptionsSnapshot<DbConnectionOptions> options)
{ {
_options = options.Value; Options = options.Value;
} }
public virtual string Resolve(string connectionStringName = null) public virtual string Resolve(string connectionStringName = null)
@ -19,7 +19,7 @@ namespace Volo.Abp.Data
//Get module specific value if provided //Get module specific value if provided
if (!connectionStringName.IsNullOrEmpty()) if (!connectionStringName.IsNullOrEmpty())
{ {
var moduleConnString = _options.ConnectionStrings.GetOrDefault(connectionStringName); var moduleConnString = Options.ConnectionStrings.GetOrDefault(connectionStringName);
if (!moduleConnString.IsNullOrEmpty()) if (!moduleConnString.IsNullOrEmpty())
{ {
return moduleConnString; return moduleConnString;
@ -27,7 +27,7 @@ namespace Volo.Abp.Data
} }
//Get default value //Get default value
return _options.ConnectionStrings.Default; return Options.ConnectionStrings.Default;
} }
} }
} }

@ -1,7 +1,10 @@
namespace Volo.Abp.Data using JetBrains.Annotations;
namespace Volo.Abp.Data
{ {
public interface IConnectionStringResolver public interface IConnectionStringResolver
{ {
[NotNull]
string Resolve(string connectionStringName = null); string Resolve(string connectionStringName = null);
} }
} }

@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Shouldly; using Shouldly;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.ExtensionMethods.Collections.Generic;
using Xunit; using Xunit;
namespace Volo.Abp.Data.MultiTenancy namespace Volo.Abp.Data.MultiTenancy
@ -73,22 +74,12 @@ namespace Volo.Abp.Data.MultiTenancy
public string GetConnectionStringOrNull(string tenantId, string connStringName) public string GetConnectionStringOrNull(string tenantId, string connStringName)
{ {
if (connStringName != null) return _options.Value.ConnectionStrings.GetOrDefault(tenantId + "#" + connStringName);
{ }
if (_options.Value.ConnectionStrings.ContainsKey(tenantId + "#" + connStringName))
{
return _options.Value.ConnectionStrings[tenantId + "#" + connStringName];
}
}
else
{
if (_options.Value.ConnectionStrings.ContainsKey(tenantId + "#Default"))
{
return _options.Value.ConnectionStrings[tenantId + "#Default"];
}
}
return null; public string GetDefaultConnectionStringOrNull(string tenantId)
{
return _options.Value.ConnectionStrings.GetOrDefault(tenantId + "#Default");
} }
} }
} }

Loading…
Cancel
Save