| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using Abp.Configuration.Startup;
- using Abp.Domain.Uow;
- using Abp.Extensions;
- using Abp.MultiTenancy;
- using Abp.Runtime.Session;
- using IwbZero.MultiTenancy;
- namespace IwbZero.EntityFramework
- {
- /// <summary>
- /// Implements <see cref="IDbPerTenantConnectionStringResolver"/> to dynamically resolve
- /// connection string for a multi tenant application.
- /// </summary>
- public class DbPerTenantConnectionStringResolver : DefaultConnectionStringResolver, IDbPerTenantConnectionStringResolver
- {
- /// <summary>
- /// Reference to the session.
- /// </summary>
- public IAbpSession AbpSession { get; set; }
- private readonly ICurrentUnitOfWorkProvider _currentUnitOfWorkProvider;
- private readonly ITenantCache _tenantCache;
- /// <summary>
- /// Initializes a new instance of the <see cref="DbPerTenantConnectionStringResolver"/> class.
- /// </summary>
- public DbPerTenantConnectionStringResolver(
- IAbpStartupConfiguration configuration,
- ICurrentUnitOfWorkProvider currentUnitOfWorkProvider,
- ITenantCache tenantCache)
- : base(
- configuration)
- {
- _currentUnitOfWorkProvider = currentUnitOfWorkProvider;
- _tenantCache = tenantCache;
- AbpSession = NullAbpSession.Instance;
- }
- public override string GetNameOrConnectionString(ConnectionStringResolveArgs args)
- {
- if (args.MultiTenancySide == MultiTenancySides.Host)
- {
- return GetNameOrConnectionString(new DbPerTenantConnectionStringResolveArgs(null, args));
- }
- return GetNameOrConnectionString(new DbPerTenantConnectionStringResolveArgs(GetCurrentTenantId(), args));
- }
- public virtual string GetNameOrConnectionString(DbPerTenantConnectionStringResolveArgs args)
- {
- if (args.TenantId == null)
- {
- //Requested for host
- return base.GetNameOrConnectionString(args);
- }
- var tenantCacheItem = _tenantCache.Get(args.TenantId.Value);
- if (tenantCacheItem==null||tenantCacheItem.ConnectionString.IsNullOrEmpty())
- {
- //Tenant has not dedicated database
- return base.GetNameOrConnectionString(args);
- }
- return tenantCacheItem.ConnectionString;
- }
- protected virtual int? GetCurrentTenantId()
- {
- return _currentUnitOfWorkProvider.Current != null
- ? _currentUnitOfWorkProvider.Current.GetTenantId()
- : AbpSession.TenantId;
- }
- }
- }
|