DbPerTenantConnectionStringResolver.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Abp.Configuration.Startup;
  2. using Abp.Domain.Uow;
  3. using Abp.Extensions;
  4. using Abp.MultiTenancy;
  5. using Abp.Runtime.Session;
  6. using IwbZero.MultiTenancy;
  7. namespace IwbZero.EntityFramework
  8. {
  9. /// <summary>
  10. /// Implements <see cref="IDbPerTenantConnectionStringResolver"/> to dynamically resolve
  11. /// connection string for a multi tenant application.
  12. /// </summary>
  13. public class DbPerTenantConnectionStringResolver : DefaultConnectionStringResolver, IDbPerTenantConnectionStringResolver
  14. {
  15. /// <summary>
  16. /// Reference to the session.
  17. /// </summary>
  18. public IAbpSession AbpSession { get; set; }
  19. private readonly ICurrentUnitOfWorkProvider _currentUnitOfWorkProvider;
  20. private readonly ITenantCache _tenantCache;
  21. /// <summary>
  22. /// Initializes a new instance of the <see cref="DbPerTenantConnectionStringResolver"/> class.
  23. /// </summary>
  24. public DbPerTenantConnectionStringResolver(
  25. IAbpStartupConfiguration configuration,
  26. ICurrentUnitOfWorkProvider currentUnitOfWorkProvider,
  27. ITenantCache tenantCache)
  28. : base(
  29. configuration)
  30. {
  31. _currentUnitOfWorkProvider = currentUnitOfWorkProvider;
  32. _tenantCache = tenantCache;
  33. AbpSession = NullAbpSession.Instance;
  34. }
  35. public override string GetNameOrConnectionString(ConnectionStringResolveArgs args)
  36. {
  37. if (args.MultiTenancySide == MultiTenancySides.Host)
  38. {
  39. return GetNameOrConnectionString(new DbPerTenantConnectionStringResolveArgs(null, args));
  40. }
  41. return GetNameOrConnectionString(new DbPerTenantConnectionStringResolveArgs(GetCurrentTenantId(), args));
  42. }
  43. public virtual string GetNameOrConnectionString(DbPerTenantConnectionStringResolveArgs args)
  44. {
  45. if (args.TenantId == null)
  46. {
  47. //Requested for host
  48. return base.GetNameOrConnectionString(args);
  49. }
  50. var tenantCacheItem = _tenantCache.Get(args.TenantId.Value);
  51. if (tenantCacheItem==null||tenantCacheItem.ConnectionString.IsNullOrEmpty())
  52. {
  53. //Tenant has not dedicated database
  54. return base.GetNameOrConnectionString(args);
  55. }
  56. return tenantCacheItem.ConnectionString;
  57. }
  58. protected virtual int? GetCurrentTenantId()
  59. {
  60. return _currentUnitOfWorkProvider.Current != null
  61. ? _currentUnitOfWorkProvider.Current.GetTenantId()
  62. : AbpSession.TenantId;
  63. }
  64. }
  65. }