TenantCache.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using Abp;
  2. using Abp.Domain.Repositories;
  3. using Abp.Domain.Uow;
  4. using Abp.Events.Bus.Entities;
  5. using Abp.Events.Bus.Handlers;
  6. using Abp.Runtime.Caching;
  7. using Abp.Runtime.Security;
  8. using IwbZero.Authorization.Base.Users;
  9. namespace IwbZero.MultiTenancy
  10. {
  11. public class TenantCache<TTenant, TUser> : ITenantCache, IEventHandler<EntityChangedEventData<TTenant>>
  12. where TTenant : IwbTenant<TUser>
  13. where TUser : UserBase
  14. {
  15. private readonly ICacheManager _cacheManager;
  16. private readonly IRepository<TTenant> _tenantRepository;
  17. private readonly IUnitOfWorkManager _unitOfWorkManager;
  18. public TenantCache(
  19. ICacheManager cacheManager,
  20. IRepository<TTenant> tenantRepository,
  21. IUnitOfWorkManager unitOfWorkManager)
  22. {
  23. _cacheManager = cacheManager;
  24. _tenantRepository = tenantRepository;
  25. _unitOfWorkManager = unitOfWorkManager;
  26. }
  27. public virtual TenantCacheItem Get(int tenantId)
  28. {
  29. var cacheItem = GetOrNull(tenantId);
  30. //if (cacheItem == null)
  31. //{
  32. // throw new AbpException("There is no tenant with given id: " + tenantId);
  33. //}
  34. return cacheItem;
  35. }
  36. public virtual TenantCacheItem Get(string tenancyName)
  37. {
  38. var cacheItem = GetOrNull(tenancyName);
  39. if (cacheItem == null)
  40. {
  41. throw new AbpException("There is no tenant with given tenancy name: " + tenancyName);
  42. }
  43. return cacheItem;
  44. }
  45. public virtual TenantCacheItem GetOrNull(string tenancyName)
  46. {
  47. var tenantId = _cacheManager
  48. .GetTenantByNameCache()
  49. .Get(
  50. tenancyName.ToLowerInvariant(),
  51. () => GetTenantOrNull(tenancyName)?.Id
  52. );
  53. if (tenantId == null)
  54. {
  55. return null;
  56. }
  57. return Get(tenantId.Value);
  58. }
  59. public TenantCacheItem GetOrNull(int tenantId)
  60. {
  61. return _cacheManager
  62. .GetTenantCache()
  63. .Get(
  64. tenantId,
  65. () =>
  66. {
  67. var tenant = GetTenantOrNull(tenantId);
  68. if (tenant == null)
  69. {
  70. return null;
  71. }
  72. return CreateTenantCacheItem(tenant);
  73. }
  74. );
  75. }
  76. protected virtual TenantCacheItem CreateTenantCacheItem(TTenant tenant)
  77. {
  78. return new TenantCacheItem
  79. {
  80. Id = tenant.Id,
  81. Name = tenant.Name,
  82. TenancyName = tenant.TenancyName,
  83. //EditionId = tenant.EditionId,
  84. ConnectionString = SimpleStringCipher.Instance.Decrypt(tenant.ConnectionString),
  85. IsActive = tenant.IsActive
  86. };
  87. }
  88. [UnitOfWork]
  89. protected virtual TTenant GetTenantOrNull(int tenantId)
  90. {
  91. using (_unitOfWorkManager.Current.SetTenantId(null))
  92. {
  93. return _tenantRepository.FirstOrDefault(tenantId);
  94. }
  95. }
  96. [UnitOfWork]
  97. protected virtual TTenant GetTenantOrNull(string tenancyName)
  98. {
  99. using (_unitOfWorkManager.Current.SetTenantId(null))
  100. {
  101. return _tenantRepository.FirstOrDefault(t => t.TenancyName == tenancyName);
  102. }
  103. }
  104. public void HandleEvent(EntityChangedEventData<TTenant> eventData)
  105. {
  106. var existingCacheItem = _cacheManager.GetTenantCache().GetOrDefault(eventData.Entity.Id);
  107. _cacheManager
  108. .GetTenantByNameCache()
  109. .Remove(
  110. existingCacheItem != null
  111. ? existingCacheItem.TenancyName.ToLowerInvariant()
  112. : eventData.Entity.TenancyName.ToLowerInvariant()
  113. );
  114. _cacheManager
  115. .GetTenantCache()
  116. .Remove(eventData.Entity.Id);
  117. }
  118. }
  119. }