diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs index 84221fb271..4d5ce2fb27 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/DefaultConnectionStringResolver.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -14,7 +15,18 @@ namespace Volo.Abp.Data Options = options.Value; } + [Obsolete("Use ResolveAsync method.")] public virtual string Resolve(string connectionStringName = null) + { + return ResolveInternal(connectionStringName); + } + + public virtual Task ResolveAsync(string connectionStringName = null) + { + return Task.FromResult(ResolveInternal(connectionStringName)); + } + + private string ResolveInternal(string connectionStringName) { //Get module specific value if provided if (!connectionStringName.IsNullOrEmpty()) @@ -25,9 +37,9 @@ namespace Volo.Abp.Data return moduleConnString; } } - + //Get default value return Options.ConnectionStrings.Default; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolver.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolver.cs index e9344ef66a..3bc8e22d78 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolver.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolver.cs @@ -1,10 +1,16 @@ -using JetBrains.Annotations; +using System; +using System.Threading.Tasks; +using JetBrains.Annotations; namespace Volo.Abp.Data { public interface IConnectionStringResolver { [NotNull] + [Obsolete("Use ResolveAsync method.")] string Resolve(string connectionStringName = null); + + [NotNull] + Task ResolveAsync(string connectionStringName = null); } } diff --git a/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs index e3a89e24e8..1fa097964c 100644 --- a/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs +++ b/framework/src/Volo.Abp.Data/Volo/Abp/Data/IConnectionStringResolverExtensions.cs @@ -1,10 +1,22 @@ -namespace Volo.Abp.Data +using System; +using System.Threading.Tasks; +using JetBrains.Annotations; + +namespace Volo.Abp.Data { public static class ConnectionStringResolverExtensions { + [NotNull] + [Obsolete("Use ResolveAsync method")] public static string Resolve(this IConnectionStringResolver resolver) { return resolver.Resolve(ConnectionStringNameAttribute.GetConnStringName()); } + + [NotNull] + public static Task ResolveAsync(this IConnectionStringResolver resolver) + { + return resolver.ResolveAsync(ConnectionStringNameAttribute.GetConnStringName()); + } } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs index a2d52eac48..0147de12fb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/DependencyInjection/DbContextOptionsFactory.cs @@ -86,7 +86,11 @@ namespace Volo.Abp.EntityFrameworkCore.DependencyInjection } var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(); + + //Use DefaultConnectionStringResolver.Resolve when we remove IConnectionStringResolver.Resolve +#pragma warning disable 618 var connectionString = serviceProvider.GetRequiredService().Resolve(connectionStringName); +#pragma warning restore 618 return new DbContextCreationContext( connectionStringName, diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs index 3539830beb..7490862b95 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs @@ -71,7 +71,7 @@ namespace Volo.Abp.Uow.EntityFrameworkCore } var connectionStringName = ConnectionStringNameAttribute.GetConnStringName(); - var connectionString = _connectionStringResolver.Resolve(connectionStringName); + var connectionString = await _connectionStringResolver.ResolveAsync(connectionStringName); var dbContextKey = $"{typeof(TDbContext).FullName}_{connectionString}"; diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs index c179b68931..6d4fb7d896 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Threading.Tasks; using Volo.Abp.Domain.Entities; namespace Volo.Abp.Domain.Repositories.MemoryDb @@ -6,9 +7,15 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb public interface IMemoryDbRepository : IRepository where TEntity : class, IEntity { + [Obsolete("Use GetDatabaseAsync() method.")] IMemoryDatabase Database { get; } + [Obsolete("Use GetCollectionAsync() method.")] IMemoryDatabaseCollection Collection { get; } + + Task GetDatabaseAsync(); + + Task> GetCollectionAsync(); } public interface IMemoryDbRepository : IMemoryDbRepository, IRepository diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs index 3318d10d72..811c51ed5f 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs @@ -21,10 +21,22 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb { //TODO: Add dbcontext just like mongodb implementation! + [Obsolete("Use GetCollectionAsync method.")] public virtual IMemoryDatabaseCollection Collection => Database.Collection(); + public async Task> GetCollectionAsync() + { + return (await GetDatabaseAsync()).Collection(); + } + + [Obsolete("Use GetDatabaseAsync method.")] public virtual IMemoryDatabase Database => DatabaseProvider.GetDatabase(); + public Task GetDatabaseAsync() + { + return DatabaseProvider.GetDatabaseAsync(); + } + protected IMemoryDatabaseProvider DatabaseProvider { get; } public ILocalEventBus LocalEventBus { get; set; } @@ -52,9 +64,9 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb return ApplyDataFilters(Collection.AsQueryable()); } - public override Task> GetQueryableAsync() + public override async Task> GetQueryableAsync() { - return Task.FromResult(ApplyDataFilters(Collection.AsQueryable())); + return ApplyDataFilters((await GetCollectionAsync()).AsQueryable()); } protected virtual async Task TriggerDomainEventsAsync(object entity) @@ -196,7 +208,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb { await ApplyAbpConceptsForAddedEntityAsync(entity); - Collection.Add(entity); + (await GetCollectionAsync()).Add(entity); return entity; } @@ -220,7 +232,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb await TriggerDomainEventsAsync(entity); - Collection.Update(entity); + (await GetCollectionAsync()).Update(entity); return entity; } @@ -235,11 +247,11 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb if (entity is ISoftDelete softDeleteEntity && !IsHardDeleted(entity)) { softDeleteEntity.IsDeleted = true; - Collection.Update(entity); + (await GetCollectionAsync()).Update(entity); } else { - Collection.Remove(entity); + (await GetCollectionAsync()).Remove(entity); } } @@ -276,13 +288,13 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb { } - public override Task InsertAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default) + public override async Task InsertAsync(TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default) { - SetIdIfNeeded(entity); - return base.InsertAsync(entity, autoSave, cancellationToken); + await SetIdIfNeededAsync(entity); + return await base.InsertAsync(entity, autoSave, cancellationToken); } - protected virtual void SetIdIfNeeded(TEntity entity) + protected virtual async Task SetIdIfNeededAsync(TEntity entity) { if (typeof(TKey) == typeof(int) || typeof(TKey) == typeof(long) || @@ -290,7 +302,8 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb { if (EntityHelper.HasDefaultId(entity)) { - EntityHelper.TrySetId(entity, () => Database.GenerateNextId()); + var nextId = (await GetDatabaseAsync()).GenerateNextId(); + EntityHelper.TrySetId(entity, () => nextId); } } } diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs index 1547a581e5..003bf8b034 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories.MemoryDb; @@ -7,18 +8,32 @@ namespace Volo.Abp.Domain.Repositories { public static class MemoryDbCoreRepositoryExtensions { + [Obsolete("Use GetDatabaseAsync method.")] public static IMemoryDatabase GetDatabase(this IBasicRepository repository) where TEntity : class, IEntity { return repository.ToMemoryDbRepository().Database; } + public static Task GetDatabaseAsync(this IBasicRepository repository) + where TEntity : class, IEntity + { + return repository.ToMemoryDbRepository().GetDatabaseAsync(); + } + + [Obsolete("Use GetCollectionAsync method.")] public static IMemoryDatabaseCollection GetCollection(this IBasicRepository repository) where TEntity : class, IEntity { return repository.ToMemoryDbRepository().Collection; } + public static Task> GetCollectionAsync(this IBasicRepository repository) + where TEntity : class, IEntity + { + return repository.ToMemoryDbRepository().GetCollectionAsync(); + } + public static IMemoryDbRepository ToMemoryDbRepository(this IBasicRepository repository) where TEntity : class, IEntity { @@ -31,4 +46,4 @@ namespace Volo.Abp.Domain.Repositories return memoryDbRepository; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/IMemoryDatabaseProvider.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/IMemoryDatabaseProvider.cs index ad4456c793..514b079e69 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/IMemoryDatabaseProvider.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/MemoryDb/IMemoryDatabaseProvider.cs @@ -1,12 +1,20 @@ -using Volo.Abp.Domain.Repositories.MemoryDb; +using System; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories.MemoryDb; namespace Volo.Abp.MemoryDb { public interface IMemoryDatabaseProvider where TMemoryDbContext : MemoryDbContext { + [Obsolete("Use GetDbContextAsync method.")] TMemoryDbContext DbContext { get; } + Task GetDbContextAsync(); + + [Obsolete("Use GetDatabaseAsync method.")] IMemoryDatabase GetDatabase(); + + Task GetDatabaseAsync(); } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs index 24c1cdaeb9..c2c5a1df71 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Uow/MemoryDb/UnitOfWorkMemoryDatabaseProvider.cs @@ -1,4 +1,6 @@ -using Volo.Abp.Data; +using System; +using System.Threading.Tasks; +using Volo.Abp.Data; using Volo.Abp.Domain.Repositories.MemoryDb; using Volo.Abp.MemoryDb; @@ -8,7 +10,7 @@ namespace Volo.Abp.Uow.MemoryDb where TMemoryDbContext : MemoryDbContext { public TMemoryDbContext DbContext { get; } - + private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IConnectionStringResolver _connectionStringResolver; private readonly MemoryDatabaseManager _memoryDatabaseManager; @@ -16,7 +18,7 @@ namespace Volo.Abp.Uow.MemoryDb public UnitOfWorkMemoryDatabaseProvider( IUnitOfWorkManager unitOfWorkManager, IConnectionStringResolver connectionStringResolver, - TMemoryDbContext dbContext, + TMemoryDbContext dbContext, MemoryDatabaseManager memoryDatabaseManager) { _unitOfWorkManager = unitOfWorkManager; @@ -25,6 +27,12 @@ namespace Volo.Abp.Uow.MemoryDb _memoryDatabaseManager = memoryDatabaseManager; } + public Task GetDbContextAsync() + { + return Task.FromResult(DbContext); + } + + [Obsolete("Use GetDatabaseAsync method.")] public IMemoryDatabase GetDatabase() { var unitOfWork = _unitOfWorkManager.Current; @@ -44,5 +52,25 @@ namespace Volo.Abp.Uow.MemoryDb return ((MemoryDbDatabaseApi)databaseApi).Database; } + + public async Task GetDatabaseAsync() + { + var unitOfWork = _unitOfWorkManager.Current; + if (unitOfWork == null) + { + throw new AbpException($"A {nameof(IMemoryDatabase)} instance can only be created inside a unit of work!"); + } + + var connectionString = await _connectionStringResolver.ResolveAsync(); + var dbContextKey = $"{typeof(TMemoryDbContext).FullName}_{connectionString}"; + + var databaseApi = unitOfWork.GetOrAddDatabaseApi( + dbContextKey, + () => new MemoryDbDatabaseApi( + _memoryDatabaseManager.Get(connectionString) + )); + + return ((MemoryDbDatabaseApi)databaseApi).Database; + } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs index 1ce1dc4649..a3d6fe7cf4 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Uow/MongoDB/UnitOfWorkMongoDbContextProvider.cs @@ -64,7 +64,7 @@ namespace Volo.Abp.Uow.MongoDB $"A {nameof(IMongoDatabase)} instance can only be created inside a unit of work!"); } - var connectionString = _connectionStringResolver.Resolve(); + var connectionString = await _connectionStringResolver.ResolveAsync(); var dbContextKey = $"{typeof(TMongoDbContext).FullName}_{connectionString}"; var mongoUrl = new MongoUrl(connectionString); diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs index 7125a97405..6c66044e37 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantStore.cs @@ -9,8 +9,10 @@ namespace Volo.Abp.MultiTenancy Task FindAsync(Guid id); + [Obsolete("Use FindAsync method.")] TenantConfiguration Find(string name); + [Obsolete("Use FindAsync method.")] TenantConfiguration Find(Guid id); } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs index d92409fe0d..0d82419013 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/MultiTenantConnectionStringResolver.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Data; @@ -23,6 +24,58 @@ namespace Volo.Abp.MultiTenancy _serviceProvider = serviceProvider; } + public override async Task ResolveAsync(string connectionStringName = null) + { + //No current tenant, fallback to default logic + if (_currentTenant.Id == null) + { + return await base.ResolveAsync(connectionStringName); + } + + using (var serviceScope = _serviceProvider.CreateScope()) + { + var tenantStore = serviceScope + .ServiceProvider + .GetRequiredService(); + + var tenant = await tenantStore.FindAsync(_currentTenant.Id.Value); + + if (tenant?.ConnectionStrings == null) + { + return await base.ResolveAsync(connectionStringName); + } + + //Requesting default connection string + if (connectionStringName == null) + { + return tenant.ConnectionStrings.Default ?? + Options.ConnectionStrings.Default; + } + + //Requesting specific connection string + var connString = tenant.ConnectionStrings.GetOrDefault(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 tenant.ConnectionStrings.Default ?? + Options.ConnectionStrings.Default; + } + } + + [Obsolete("Use ResolveAsync method.")] public override string Resolve(string connectionStringName = null) { //No current tenant, fallback to default logic diff --git a/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs b/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs index d13c89671e..3971c29ff0 100644 --- a/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs +++ b/framework/test/Volo.Abp.Data.Tests/Volo/Abp/Data/ConnectionStringResolver_Tests.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.Modularity; using Volo.Abp.Testing; @@ -21,21 +22,21 @@ namespace Volo.Abp.Data } [Fact] - public void Should_Get_Default_ConnString_By_Default() + public async Task Should_Get_Default_ConnString_By_Default() { - _connectionStringResolver.Resolve().ShouldBe(DefaultConnString); + (await _connectionStringResolver.ResolveAsync()).ShouldBe(DefaultConnString); } [Fact] - public void Should_Get_Specific_ConnString_IfDefined() + public async Task Should_Get_Specific_ConnString_IfDefined() { - _connectionStringResolver.Resolve(Database1Name).ShouldBe(Database1ConnString); + (await _connectionStringResolver.ResolveAsync(Database1Name)).ShouldBe(Database1ConnString); } [Fact] - public void Should_Get_Default_ConnString_If_Not_Specified() + public async Task Should_Get_Default_ConnString_If_Not_Specified() { - _connectionStringResolver.Resolve(Database2Name).ShouldBe(DefaultConnString); + (await _connectionStringResolver.ResolveAsync(Database2Name)).ShouldBe(DefaultConnString); } [DependsOn(typeof(AbpDataModule))] diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/CityRepository.cs b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/CityRepository.cs index b6d43dc875..309339e09d 100644 --- a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/CityRepository.cs +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/TestApp/MemoryDb/CityRepository.cs @@ -10,21 +10,21 @@ namespace Volo.Abp.TestApp.MemoryDb { public class CityRepository : MemoryDbRepository, ICityRepository { - public CityRepository(IMemoryDatabaseProvider databaseProvider) + public CityRepository(IMemoryDatabaseProvider databaseProvider) : base(databaseProvider) { } - public Task FindByNameAsync(string name) + public async Task FindByNameAsync(string name) { - return Task.FromResult(Collection.FirstOrDefault(c => c.Name == name)); + return (await GetCollectionAsync()).FirstOrDefault(c => c.Name == name); } public async Task> GetPeopleInTheCityAsync(string cityName) { var city = await FindByNameAsync(cityName); - return Database.Collection().Where(p => p.CityId == city.Id).ToList(); + return (await GetDatabaseAsync()).Collection().Where(p => p.CityId == city.Id).ToList(); } } } diff --git a/framework/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs b/framework/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs index a6e5fab1c8..f6af2bde72 100644 --- a/framework/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs +++ b/framework/test/Volo.Abp.MultiTenancy.Tests/Volo/Abp/Data/MultiTenancy/MultiTenantConnectionStringResolver_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Shouldly; using Volo.Abp.MultiTenancy; @@ -49,28 +50,28 @@ namespace Volo.Abp.Data.MultiTenancy } [Fact] - public void All_Tests() + public async Task All_Tests() { //No tenant in current context - _connectionResolver.Resolve().ShouldBe("default-value"); - _connectionResolver.Resolve("db1").ShouldBe("db1-default-value"); + (await _connectionResolver.ResolveAsync()).ShouldBe("default-value"); + (await _connectionResolver.ResolveAsync("db1")).ShouldBe("db1-default-value"); - //Overrided connection strings for tenant1 + //Overriden connection strings for tenant1 using (_currentTenant.Change(_tenant1Id)) { - _connectionResolver.Resolve().ShouldBe("tenant1-default-value"); - _connectionResolver.Resolve("db1").ShouldBe("tenant1-db1-value"); + (await _connectionResolver.ResolveAsync()).ShouldBe("tenant1-default-value"); + (await _connectionResolver.ResolveAsync("db1")).ShouldBe("tenant1-db1-value"); } //No tenant in current context - _connectionResolver.Resolve().ShouldBe("default-value"); - _connectionResolver.Resolve("db1").ShouldBe("db1-default-value"); + (await _connectionResolver.ResolveAsync()).ShouldBe("default-value"); + (await _connectionResolver.ResolveAsync("db1")).ShouldBe("db1-default-value"); //Undefined connection strings for tenant2 using (_currentTenant.Change(_tenant2Id)) { - _connectionResolver.Resolve().ShouldBe("default-value"); - _connectionResolver.Resolve("db1").ShouldBe("db1-default-value"); + (await _connectionResolver.ResolveAsync()).ShouldBe("default-value"); + (await _connectionResolver.ResolveAsync("db1")).ShouldBe("db1-default-value"); } } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs index 1feca866a2..8a3fc0b19a 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs @@ -9,30 +9,32 @@ namespace Volo.Abp.TenantManagement public interface ITenantRepository : IBasicRepository { Task FindByNameAsync( - string name, - bool includeDetails = true, + string name, + bool includeDetails = true, CancellationToken cancellationToken = default); + [Obsolete("Use FindByNameAsync method.")] Tenant FindByName( string name, bool includeDetails = true ); + [Obsolete("Use FindAsync method.")] Tenant FindById( Guid id, bool includeDetails = true ); Task> GetListAsync( - string sorting = null, - int maxResultCount = int.MaxValue, - int skipCount = 0, - string filter = null, + string sorting = null, + int maxResultCount = int.MaxValue, + int skipCount = 0, + string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default); Task GetCountAsync( - string filter = null, + string filter = null, CancellationToken cancellationToken = default); } -} \ No newline at end of file +} diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantStore.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantStore.cs index 5847ed7d89..00b9ef0963 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantStore.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/TenantStore.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.TenantManagement protected ICurrentTenant CurrentTenant { get; } public TenantStore( - ITenantRepository tenantRepository, + ITenantRepository tenantRepository, IObjectMapper objectMapper, ICurrentTenant currentTenant) { @@ -52,6 +52,7 @@ namespace Volo.Abp.TenantManagement } } + [Obsolete("Use FindAsync method.")] public virtual TenantConfiguration Find(string name) { using (CurrentTenant.Change(null)) //TODO: No need this if we can implement to define host side (or tenant-independent) entities! @@ -66,6 +67,7 @@ namespace Volo.Abp.TenantManagement } } + [Obsolete("Use FindAsync method.")] public virtual TenantConfiguration Find(Guid id) { using (CurrentTenant.Change(null)) //TODO: No need this if we can implement to define host side (or tenant-independent) entities! diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs index 36d28b7659..4b6208e232 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs @@ -28,6 +28,7 @@ namespace Volo.Abp.TenantManagement.EntityFrameworkCore .FirstOrDefaultAsync(t => t.Name == name, GetCancellationToken(cancellationToken)); } + [Obsolete("Use FindByNameAsync method.")] public virtual Tenant FindByName(string name, bool includeDetails = true) { return DbSet @@ -35,6 +36,7 @@ namespace Volo.Abp.TenantManagement.EntityFrameworkCore .FirstOrDefault(t => t.Name == name); } + [Obsolete("Use FindAsync method.")] public virtual Tenant FindById(Guid id, bool includeDetails = true) { return DbSet diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs index abd03ab65d..a2805f7333 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs @@ -28,12 +28,14 @@ namespace Volo.Abp.TenantManagement.MongoDB .FirstOrDefaultAsync(t => t.Name == name, GetCancellationToken(cancellationToken)); } + [Obsolete("Use FindByNameAsync method.")] public virtual Tenant FindByName(string name, bool includeDetails = true) { return GetMongoQueryable() .FirstOrDefault(t => t.Name == name); } + [Obsolete("Use FindAsync method.")] public virtual Tenant FindById(Guid id, bool includeDetails = true) { return GetMongoQueryable()