mirror of https://github.com/abpframework/abp.git
committed by
GitHub
64 changed files with 1673 additions and 16 deletions
@ -0,0 +1,45 @@ |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace Volo.Abp.MultiTenancy |
|||
{ |
|||
public class TenantSettingValueProvider : SettingValueProvider |
|||
{ |
|||
public const string ProviderName = "Tenant"; |
|||
|
|||
public override string Name => ProviderName; |
|||
|
|||
protected ICurrentTenant CurrentTenant { get; } |
|||
|
|||
public TenantSettingValueProvider(ISettingStore settingStore, ICurrentTenant currentTenant) |
|||
: base(settingStore) |
|||
{ |
|||
CurrentTenant = currentTenant; |
|||
} |
|||
|
|||
public override async Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
if (providerKey == null) |
|||
{ |
|||
if (CurrentTenant.Id == null) |
|||
{ |
|||
return null; |
|||
} |
|||
|
|||
providerKey = CurrentTenant.Id.ToString(); |
|||
} |
|||
|
|||
return await SettingStore.GetOrNullAsync(setting.Name, Name, providerKey); |
|||
} |
|||
|
|||
public override Task SetAsync(SettingDefinition setting, string value, string providerKey) |
|||
{ |
|||
return SettingStore.SetAsync(setting.Name, value, Name, providerKey); |
|||
} |
|||
|
|||
public override Task ClearAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
return SettingStore.DeleteAsync(setting.Name, Name, providerKey); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp.MultiTenancy; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public static class TenantSettingManagerExtensions |
|||
{ |
|||
public static Task<string> GetOrNullForTenantAsync(this ISettingManager settingManager, [NotNull] string name, Guid tenantId, bool fallback = true) |
|||
{ |
|||
return settingManager.GetOrNullAsync(name, TenantSettingValueProvider.ProviderName, tenantId.ToString(), fallback); |
|||
} |
|||
|
|||
public static Task<string> GetOrNullForCurrentTenantAsync(this ISettingManager settingManager, [NotNull] string name, bool fallback = true) |
|||
{ |
|||
return settingManager.GetOrNullAsync(name, TenantSettingValueProvider.ProviderName, null, fallback); |
|||
} |
|||
|
|||
public static Task<List<SettingValue>> GetAllForTenantAsync(this ISettingManager settingManager, Guid tenantId, bool fallback = true) |
|||
{ |
|||
return settingManager.GetAllAsync(TenantSettingValueProvider.ProviderName, tenantId.ToString(), fallback); |
|||
} |
|||
|
|||
public static Task<List<SettingValue>> GetAllForCurrentTenantAsync(this ISettingManager settingManager, bool fallback = true) |
|||
{ |
|||
return settingManager.GetAllAsync(TenantSettingValueProvider.ProviderName, null, fallback); |
|||
} |
|||
|
|||
public static Task SetForTenantAsync(this ISettingManager settingManager, Guid tenantId, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false) |
|||
{ |
|||
return settingManager.SetAsync(name, value, TenantSettingValueProvider.ProviderName, tenantId.ToString(), forceToSet); |
|||
} |
|||
|
|||
public static Task SetForCurrentTenantAsync(this ISettingManager settingManager, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false) |
|||
{ |
|||
return settingManager.SetAsync(name, value, TenantSettingValueProvider.ProviderName, null, forceToSet); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,47 @@ |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Settings; |
|||
|
|||
namespace Volo.Abp.Session |
|||
{ |
|||
//TODO: Optimization: Get all settings and cache it!
|
|||
|
|||
public class UserSettingValueProvider : SettingValueProvider |
|||
{ |
|||
public const string ProviderName = "User"; |
|||
|
|||
public override string Name => ProviderName; |
|||
|
|||
protected ICurrentUser CurrentUser { get; } |
|||
|
|||
public UserSettingValueProvider(ISettingStore settingStore, ICurrentUser currentUser) |
|||
: base(settingStore) |
|||
{ |
|||
CurrentUser = currentUser; |
|||
} |
|||
|
|||
public override async Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
if (providerKey == null) |
|||
{ |
|||
if (CurrentUser.Id == null) |
|||
{ |
|||
return null; |
|||
} |
|||
|
|||
providerKey = CurrentUser.Id.ToString(); |
|||
} |
|||
|
|||
return await SettingStore.GetOrNullAsync(setting.Name, Name, providerKey); |
|||
} |
|||
|
|||
public override Task SetAsync(SettingDefinition setting, string value, string providerKey) |
|||
{ |
|||
return SettingStore.SetAsync(setting.Name, value, Name, providerKey); |
|||
} |
|||
|
|||
public override Task ClearAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
return SettingStore.DeleteAsync(setting.Name, Name, providerKey); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp.Session; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public static class UserSettingManagerExtensions |
|||
{ |
|||
public static Task<string> GetOrNullForUserAsync(this ISettingManager settingManager, [NotNull] string name, Guid userId, bool fallback = true) |
|||
{ |
|||
return settingManager.GetOrNullAsync(name, UserSettingValueProvider.ProviderName, userId.ToString(), fallback); |
|||
} |
|||
|
|||
public static Task<string> GetOrNullForCurrentUserAsync(this ISettingManager settingManager, [NotNull] string name, bool fallback = true) |
|||
{ |
|||
return settingManager.GetOrNullAsync(name, UserSettingValueProvider.ProviderName, null, fallback); |
|||
} |
|||
|
|||
public static Task<List<SettingValue>> GetAllForUserAsync(this ISettingManager settingManager, Guid userId, bool fallback = true) |
|||
{ |
|||
return settingManager.GetAllAsync(UserSettingValueProvider.ProviderName, userId.ToString(), fallback); |
|||
} |
|||
|
|||
public static Task<List<SettingValue>> GetAllForCurrentUserAsync(this ISettingManager settingManager, bool fallback = true) |
|||
{ |
|||
return settingManager.GetAllAsync(UserSettingValueProvider.ProviderName, null, fallback); |
|||
} |
|||
|
|||
public static Task SetForUserAsync(this ISettingManager settingManager, Guid userId, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false) |
|||
{ |
|||
return settingManager.SetAsync(name, value, UserSettingValueProvider.ProviderName, userId.ToString(), forceToSet); |
|||
} |
|||
|
|||
public static Task SetForCurrentUserAsync(this ISettingManager settingManager, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false) |
|||
{ |
|||
return settingManager.SetAsync(name, value, UserSettingValueProvider.ProviderName, null, forceToSet); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,20 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>netstandard2.0</TargetFramework> |
|||
<AssemblyName>Volo.Abp.Settings.Domain.Shared</AssemblyName> |
|||
<PackageId>Volo.Abp.Settings.Domain.Shared</PackageId> |
|||
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> |
|||
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> |
|||
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> |
|||
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> |
|||
<RootNamespace /> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,13 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class AbpSettingsDomainSharedModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(IServiceCollection services) |
|||
{ |
|||
services.AddAssemblyOf<AbpSettingsDomainSharedModule>(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public static class SettingsConsts |
|||
{ |
|||
public const int MaxNameLength = 128; |
|||
public const int MaxValueLength = 2048; |
|||
public const int MaxProviderNameLength = 64; |
|||
public const int MaxProviderKeyLength = 64; |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>netstandard2.0</TargetFramework> |
|||
<AssemblyName>Volo.Abp.Settings.Domain</AssemblyName> |
|||
<PackageId>Volo.Abp.Settings.Domain</PackageId> |
|||
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> |
|||
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> |
|||
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> |
|||
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> |
|||
<RootNamespace /> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\Volo.Abp.Ddd\Volo.Abp.Ddd.csproj" /> |
|||
<ProjectReference Include="..\Volo.Abp.Settings.Domain.Shared\Volo.Abp.Settings.Domain.Shared.csproj" /> |
|||
<ProjectReference Include="..\Volo.Abp.Settings\Volo.Abp.Settings.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,9 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public static class AbpSettingsConsts |
|||
{ |
|||
public const string DefaultDbTablePrefix = "Abp"; |
|||
|
|||
public const string DefaultDbSchema = null; |
|||
} |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
[DependsOn(typeof(AbpSettingsModule))] |
|||
[DependsOn(typeof(AbpDddModule))] |
|||
[DependsOn(typeof(AbpSettingsDomainSharedModule))] |
|||
public class AbpSettingsDomainModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(IServiceCollection services) |
|||
{ |
|||
services.AddAssemblyOf<AbpSettingsDomainModule>(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,14 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.Domain.Repositories; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingRepository : IBasicRepository<Setting, Guid> |
|||
{ |
|||
Task<Setting> FindAsync(string name, string providerName, string providerKey); |
|||
|
|||
Task<List<Setting>> GetListAsync(string providerName, string providerKey); |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
using System; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp.Domain.Entities; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class Setting : Entity<Guid> |
|||
{ |
|||
[NotNull] |
|||
public virtual string Name { get; protected set; } |
|||
|
|||
[NotNull] |
|||
public virtual string Value { get; internal set; } |
|||
|
|||
[CanBeNull] |
|||
public virtual string ProviderName { get; protected set; } |
|||
|
|||
[CanBeNull] |
|||
public virtual string ProviderKey { get; protected set; } |
|||
|
|||
protected Setting() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public Setting( |
|||
Guid id, |
|||
[NotNull] string name, |
|||
[NotNull] string value, |
|||
[CanBeNull] string providerName = null, |
|||
[CanBeNull] string providerKey = null) |
|||
{ |
|||
Check.NotNull(name, nameof(name)); |
|||
Check.NotNull(value, nameof(value)); |
|||
|
|||
Id = id; |
|||
Name = name; |
|||
Value = value; |
|||
ProviderName = providerName; |
|||
ProviderKey = providerKey; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,51 @@ |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingStore : AbpServiceBase, ISettingStore, ITransientDependency |
|||
{ |
|||
private readonly ISettingRepository _settingRepository; |
|||
|
|||
public SettingStore(ISettingRepository settingRepository) |
|||
{ |
|||
_settingRepository = settingRepository; |
|||
} |
|||
|
|||
public async Task<string> GetOrNullAsync(string name, string providerName, string providerKey) |
|||
{ |
|||
var setting = await _settingRepository.FindAsync(name, providerName, providerKey); |
|||
return setting?.Value; |
|||
} |
|||
|
|||
public async Task SetAsync(string name, string value, string providerName, string providerKey) |
|||
{ |
|||
var setting = await _settingRepository.FindAsync(name, providerName, providerKey); |
|||
if (setting == null) |
|||
{ |
|||
setting = new Setting(GuidGenerator.Create(), name, value, providerName, providerKey); |
|||
await _settingRepository.InsertAsync(setting); |
|||
} |
|||
|
|||
setting.Value = value; |
|||
await _settingRepository.UpdateAsync(setting); |
|||
} |
|||
|
|||
public async Task<List<SettingValue>> GetListAsync(string providerName, string providerKey) |
|||
{ |
|||
var setting = await _settingRepository.GetListAsync(providerName, providerKey); |
|||
return setting.Select(s => new SettingValue(s.Name, s.Value)).ToList(); |
|||
} |
|||
|
|||
public async Task DeleteAsync(string name, string providerName, string providerKey) |
|||
{ |
|||
var setting = await _settingRepository.FindAsync(name, providerName, providerKey); |
|||
if (setting != null) |
|||
{ |
|||
await _settingRepository.DeleteAsync(setting); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>netstandard2.0</TargetFramework> |
|||
<AssemblyName>Volo.Abp.Settings.EntityFrameworkCore</AssemblyName> |
|||
<PackageId>Volo.Abp.Settings.EntityFrameworkCore</PackageId> |
|||
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> |
|||
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> |
|||
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> |
|||
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> |
|||
<RootNamespace /> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\Volo.Abp.EntityFrameworkCore\Volo.Abp.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\Volo.Abp.Settings.Domain\Volo.Abp.Settings.Domain.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,28 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp.Data; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
|
|||
namespace Volo.Abp.Settings.EntityFrameworkCore |
|||
{ |
|||
[ConnectionStringName("AbpSettings")] |
|||
public class AbpSettingsDbContext : AbpDbContext<AbpSettingsDbContext>, IAbpSettingsDbContext |
|||
{ |
|||
public static string TablePrefix { get; set; } = AbpSettingsConsts.DefaultDbTablePrefix; |
|||
|
|||
public static string Schema { get; set; } = AbpSettingsConsts.DefaultDbSchema; |
|||
|
|||
public DbSet<Setting> Settings { get; set; } |
|||
|
|||
public AbpSettingsDbContext(DbContextOptions<AbpSettingsDbContext> options) |
|||
: base(options) |
|||
{ |
|||
|
|||
} |
|||
|
|||
protected override void OnModelCreating(ModelBuilder builder) |
|||
{ |
|||
base.OnModelCreating(builder); |
|||
builder.ConfigureAbpSettings(TablePrefix, Schema); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
using JetBrains.Annotations; |
|||
using Microsoft.EntityFrameworkCore; |
|||
|
|||
namespace Volo.Abp.Settings.EntityFrameworkCore |
|||
{ |
|||
public static class AbpSettingsDbContextModelBuilderExtensions |
|||
{ |
|||
public static void ConfigureAbpSettings( |
|||
[NotNull] this ModelBuilder builder, |
|||
[CanBeNull] string tablePrefix = AbpSettingsConsts.DefaultDbTablePrefix, |
|||
[CanBeNull] string schema = AbpSettingsConsts.DefaultDbSchema) |
|||
{ |
|||
Check.NotNull(builder, nameof(builder)); |
|||
|
|||
if (tablePrefix == null) |
|||
{ |
|||
tablePrefix = ""; |
|||
} |
|||
|
|||
builder.Entity<Setting>(b => |
|||
{ |
|||
b.ToTable(tablePrefix + "Settings", schema); |
|||
|
|||
b.Property(x => x.Name).HasMaxLength(SettingsConsts.MaxNameLength).IsRequired(); |
|||
b.Property(x => x.Value).HasMaxLength(SettingsConsts.MaxValueLength).IsRequired(); |
|||
b.Property(x => x.ProviderName).HasMaxLength(SettingsConsts.MaxProviderNameLength); |
|||
b.Property(x => x.ProviderKey).HasMaxLength(SettingsConsts.MaxProviderKeyLength); |
|||
|
|||
b.HasIndex(x => new {x.Name, x.ProviderName, x.ProviderKey}); |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace Volo.Abp.Settings.EntityFrameworkCore |
|||
{ |
|||
[DependsOn(typeof(AbpSettingsDomainModule))] |
|||
[DependsOn(typeof(AbpEntityFrameworkCoreModule))] |
|||
public class AbpSettingsEntityFrameworkCoreModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(IServiceCollection services) |
|||
{ |
|||
services.AddAbpDbContext<AbpSettingsDbContext>(options => |
|||
{ |
|||
options.AddDefaultRepositories<IAbpSettingsDbContext>(); |
|||
|
|||
options.AddRepository<Setting, EfCoreSettingRepository>(); |
|||
}); |
|||
|
|||
services.AddAssemblyOf<AbpSettingsEntityFrameworkCoreModule>(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,28 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp.Domain.Repositories.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
|
|||
namespace Volo.Abp.Settings.EntityFrameworkCore |
|||
{ |
|||
public class EfCoreSettingRepository : EfCoreRepository<IAbpSettingsDbContext, Setting, Guid>, ISettingRepository |
|||
{ |
|||
public EfCoreSettingRepository(IDbContextProvider<IAbpSettingsDbContext> dbContextProvider) |
|||
: base(dbContextProvider) |
|||
{ |
|||
} |
|||
|
|||
public async Task<Setting> FindAsync(string name, string providerName, string providerKey) |
|||
{ |
|||
return await DbSet.FirstOrDefaultAsync(s => s.Name == name && s.ProviderName == providerName && s.ProviderKey == providerKey); |
|||
} |
|||
|
|||
public async Task<List<Setting>> GetListAsync(string providerName, string providerKey) |
|||
{ |
|||
return await DbSet.Where(s => s.ProviderName == providerName && s.ProviderKey == providerKey).ToListAsync(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
|
|||
namespace Volo.Abp.Settings.EntityFrameworkCore |
|||
{ |
|||
public interface IAbpSettingsDbContext : IEfCoreDbContext |
|||
{ |
|||
DbSet<Setting> Settings { get; set; } |
|||
} |
|||
} |
|||
@ -0,0 +1,20 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<Import Project="..\..\common.props" /> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>netstandard2.0</TargetFramework> |
|||
<AssemblyName>Volo.Abp.Settings</AssemblyName> |
|||
<PackageId>Volo.Abp.Settings</PackageId> |
|||
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> |
|||
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> |
|||
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> |
|||
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> |
|||
<RootNamespace /> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,13 @@ |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Modularity; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class AbpSettingsModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(IServiceCollection services) |
|||
{ |
|||
services.AddAssemblyOf<AbpSettingsModule>(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class DefaultValueSettingValueProvider : SettingValueProvider |
|||
{ |
|||
public const string ProviderName = null; |
|||
|
|||
public override string Name => ProviderName; |
|||
|
|||
public DefaultValueSettingValueProvider(ISettingStore settingStore) |
|||
: base(settingStore) |
|||
{ |
|||
|
|||
} |
|||
|
|||
public override Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
return Task.FromResult(setting.DefaultValue); |
|||
} |
|||
|
|||
public override Task SetAsync(SettingDefinition setting, string value, string providerKey) |
|||
{ |
|||
setting.DefaultValue = value; |
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
public override Task ClearAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
setting.DefaultValue = null; |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public static class GlobalSettingManagerExtensions |
|||
{ |
|||
public static Task<string> GetOrNullGlobalAsync(this ISettingManager settingManager, [NotNull] string name, bool fallback = true) |
|||
{ |
|||
return settingManager.GetOrNullAsync(name, GlobalSettingValueProvider.ProviderName, null, fallback); |
|||
} |
|||
|
|||
public static Task<List<SettingValue>> GetAllGlobalAsync(this ISettingManager settingManager, bool fallback = true) |
|||
{ |
|||
return settingManager.GetAllAsync(GlobalSettingValueProvider.ProviderName, null, fallback); |
|||
} |
|||
|
|||
public static Task SetGlobalAsync(this ISettingManager settingManager, [NotNull] string name, [CanBeNull] string value) |
|||
{ |
|||
return settingManager.SetAsync(name, value, GlobalSettingValueProvider.ProviderName, null); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,31 @@ |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class GlobalSettingValueProvider : SettingValueProvider |
|||
{ |
|||
public const string ProviderName = "Global"; |
|||
|
|||
public override string Name => ProviderName; |
|||
|
|||
public GlobalSettingValueProvider(ISettingStore settingStore) |
|||
: base(settingStore) |
|||
{ |
|||
} |
|||
|
|||
public override Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
return SettingStore.GetOrNullAsync(setting.Name, Name, null); |
|||
} |
|||
|
|||
public override Task SetAsync(SettingDefinition setting, string value, string providerKey) |
|||
{ |
|||
return SettingStore.SetAsync(setting.Name, value, Name, null); |
|||
} |
|||
|
|||
public override Task ClearAsync(SettingDefinition setting, string providerKey) |
|||
{ |
|||
return SettingStore.DeleteAsync(setting.Name, Name, null); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingDefinitionContext |
|||
{ |
|||
SettingDefinition GetOrNull(string name); |
|||
|
|||
void Add(params SettingDefinition[] definitions); |
|||
} |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
using System.Collections.Generic; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingDefinitionManager |
|||
{ |
|||
[NotNull] |
|||
SettingDefinition Get([NotNull] string name); |
|||
|
|||
IReadOnlyList<SettingDefinition> GetAll(); |
|||
} |
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingDefinitionProvider |
|||
{ |
|||
void Define(ISettingDefinitionContext context); |
|||
} |
|||
} |
|||
@ -0,0 +1,19 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingManager |
|||
{ |
|||
Task<string> GetOrNullAsync([NotNull]string name); |
|||
|
|||
Task<string> GetOrNullAsync([NotNull]string name, [NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true); |
|||
|
|||
Task<List<SettingValue>> GetAllAsync(); |
|||
|
|||
Task<List<SettingValue>> GetAllAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true); |
|||
|
|||
Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false); |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingStore |
|||
{ |
|||
Task<string> GetOrNullAsync([NotNull] string name, [CanBeNull] string providerName, [CanBeNull] string providerKey); |
|||
|
|||
Task SetAsync([NotNull] string name, [NotNull] string value, [CanBeNull] string providerName, [CanBeNull] string providerKey); |
|||
|
|||
Task<List<SettingValue>> GetListAsync([CanBeNull] string providerName, [CanBeNull] string providerKey); |
|||
|
|||
Task DeleteAsync([NotNull] string name, [CanBeNull]string providerName, [CanBeNull]string providerKey); |
|||
} |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingValueProvider |
|||
{ |
|||
string Name { get; } |
|||
|
|||
Task<string> GetOrNullAsync([NotNull] SettingDefinition setting, [CanBeNull] string providerKey); |
|||
|
|||
Task SetAsync([NotNull] SettingDefinition setting, [NotNull] string value, [CanBeNull] string providerKey); |
|||
|
|||
Task ClearAsync([NotNull] SettingDefinition setting, [CanBeNull] string providerKey); |
|||
} |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class NullSettingStore : ISettingStore, ISingletonDependency |
|||
{ |
|||
public Task<string> GetOrNullAsync(string name, string providerName, string providerKey) |
|||
{ |
|||
return Task.FromResult((string) null); |
|||
} |
|||
|
|||
public Task SetAsync(string name, string value, string providerName, string providerKey) |
|||
{ |
|||
return Task.CompletedTask; |
|||
} |
|||
|
|||
public Task<List<SettingValue>> GetListAsync(string providerName, string providerKey) |
|||
{ |
|||
return Task.FromResult(new List<SettingValue>()); |
|||
} |
|||
|
|||
public Task DeleteAsync(string name, string providerName, string providerKey) |
|||
{ |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,47 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingDefinition |
|||
{ |
|||
/// <summary>
|
|||
/// Unique name of the setting.
|
|||
/// </summary>
|
|||
public string Name { get; } |
|||
|
|||
/// <summary>
|
|||
/// Default value of the setting.
|
|||
/// </summary>
|
|||
public string DefaultValue { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// Can clients see this setting and it's value.
|
|||
/// It maybe dangerous for some settings to be visible to clients (such as an email server password).
|
|||
/// Default: false.
|
|||
/// </summary>
|
|||
public bool IsVisibleToClients { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// Is this setting inherited from parent scopes.
|
|||
/// Default: True.
|
|||
/// </summary>
|
|||
public bool IsInherited { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// Can be used to store a custom object related to this setting.
|
|||
/// </summary>
|
|||
public object CustomData { get; set; } |
|||
|
|||
public SettingDefinition( |
|||
string name, |
|||
string defaultValue = null, |
|||
bool isVisibleToClients = false, |
|||
bool isInherited = true, |
|||
object customData = null) |
|||
{ |
|||
Name = name; |
|||
DefaultValue = defaultValue; |
|||
IsVisibleToClients = isVisibleToClients; |
|||
IsInherited = isInherited; |
|||
CustomData = customData; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
using System.Collections.Generic; |
|||
using System.Collections.Immutable; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingDefinitionContext : ISettingDefinitionContext |
|||
{ |
|||
protected Dictionary<string, SettingDefinition> Settings { get; } |
|||
|
|||
public SettingDefinitionContext(Dictionary<string, SettingDefinition> settings) |
|||
{ |
|||
Settings = settings; |
|||
} |
|||
|
|||
public virtual SettingDefinition GetOrNull(string name) |
|||
{ |
|||
return Settings.GetOrDefault(name); |
|||
} |
|||
|
|||
public virtual IReadOnlyList<SettingDefinition> GetAll() |
|||
{ |
|||
return Settings.Values.ToImmutableList(); |
|||
} |
|||
|
|||
public virtual void Add(params SettingDefinition[] definitions) |
|||
{ |
|||
if (definitions.IsNullOrEmpty()) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
foreach (var definition in definitions) |
|||
{ |
|||
Settings[definition.Name] = definition; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,76 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Collections.Immutable; |
|||
using System.Linq; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency |
|||
{ |
|||
protected Lazy<List<ISettingDefinitionProvider>> Providers { get; } |
|||
|
|||
protected Lazy<IDictionary<string, SettingDefinition>> SettingDefinitions { get; } |
|||
|
|||
protected SettingOptions Options { get; } |
|||
|
|||
private readonly IServiceProvider _serviceProvider; |
|||
|
|||
public SettingDefinitionManager( |
|||
IOptions<SettingOptions> options, |
|||
IServiceProvider serviceProvider) |
|||
{ |
|||
_serviceProvider = serviceProvider; |
|||
Options = options.Value; |
|||
|
|||
Providers = new Lazy<List<ISettingDefinitionProvider>>(CreateSettingProviders, true); |
|||
SettingDefinitions = new Lazy<IDictionary<string, SettingDefinition>>(CreateSettingDefinitions, true); |
|||
} |
|||
|
|||
public virtual SettingDefinition Get(string name) |
|||
{ |
|||
Check.NotNull(name, nameof(name)); |
|||
|
|||
var settingDefinition = GetOrNull(name); |
|||
|
|||
if (settingDefinition == null) |
|||
{ |
|||
throw new AbpException("Undefined setting: " + name); |
|||
} |
|||
|
|||
return settingDefinition; |
|||
} |
|||
|
|||
public IReadOnlyList<SettingDefinition> GetAll() |
|||
{ |
|||
return SettingDefinitions.Value.Values.ToImmutableList(); |
|||
} |
|||
|
|||
public virtual SettingDefinition GetOrNull(string name) |
|||
{ |
|||
return SettingDefinitions.Value.GetOrDefault(name); |
|||
} |
|||
|
|||
private List<ISettingDefinitionProvider> CreateSettingProviders() |
|||
{ |
|||
return Options |
|||
.DefinitionProviders |
|||
.Select(p => _serviceProvider.GetRequiredService(p) as ISettingDefinitionProvider) |
|||
.ToList(); |
|||
} |
|||
|
|||
private IDictionary<string, SettingDefinition> CreateSettingDefinitions() |
|||
{ |
|||
var settings = new Dictionary<string, SettingDefinition>(); |
|||
|
|||
foreach (var provider in Providers.Value) |
|||
{ |
|||
provider.Define(new SettingDefinitionContext(settings)); |
|||
} |
|||
|
|||
return settings; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public abstract class SettingDefinitionProvider : ISettingDefinitionProvider, ISingletonDependency |
|||
{ |
|||
public abstract void Define(ISettingDefinitionContext context); |
|||
} |
|||
} |
|||
@ -0,0 +1,194 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Options; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingManager : ISettingManager, ISingletonDependency |
|||
{ |
|||
protected ISettingDefinitionManager SettingDefinitionManager { get; } |
|||
|
|||
protected Lazy<List<ISettingValueProvider>> Providers { get; } |
|||
|
|||
protected SettingOptions Options { get; } |
|||
|
|||
protected ISettingStore SettingStore { get; } |
|||
|
|||
public SettingManager( |
|||
IOptions<SettingOptions> options, |
|||
IServiceProvider serviceProvider, |
|||
ISettingDefinitionManager settingDefinitionManager, |
|||
ISettingStore settingStore) |
|||
{ |
|||
SettingStore = settingStore; |
|||
SettingDefinitionManager = settingDefinitionManager; |
|||
Options = options.Value; |
|||
|
|||
Providers = new Lazy<List<ISettingValueProvider>>( |
|||
() => Options |
|||
.ValueProviders |
|||
.Select(c => serviceProvider.GetRequiredService(c) as ISettingValueProvider) |
|||
.ToList(), |
|||
true |
|||
); |
|||
} |
|||
|
|||
public virtual Task<string> GetOrNullAsync(string name) |
|||
{ |
|||
Check.NotNull(name, nameof(name)); |
|||
|
|||
return GetOrNullInternalAsync(name, null, null); |
|||
} |
|||
|
|||
public virtual Task<string> GetOrNullAsync(string name, string providerName, string providerKey, bool fallback = true) |
|||
{ |
|||
Check.NotNull(name, nameof(name)); |
|||
Check.NotNull(providerName, nameof(providerName)); |
|||
|
|||
return GetOrNullInternalAsync(name, providerName, providerKey, fallback); |
|||
} |
|||
|
|||
public virtual async Task<string> GetOrNullInternalAsync(string name, string providerName, string providerKey, bool fallback = true) |
|||
{ |
|||
var setting = SettingDefinitionManager.Get(name); |
|||
var providers = Enumerable |
|||
.Reverse(Providers.Value); |
|||
|
|||
if (providerName != null) |
|||
{ |
|||
providers = providers.SkipWhile(c => c.Name != providerName); |
|||
} |
|||
|
|||
if (!fallback || !setting.IsInherited) |
|||
{ |
|||
providers = providers.TakeWhile(c => c.Name == providerName); |
|||
} |
|||
|
|||
foreach (var provider in providers) |
|||
{ |
|||
var value = await provider.GetOrNullAsync(setting, providerKey); |
|||
if (value != null) |
|||
{ |
|||
return value; |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
public virtual async Task<List<SettingValue>> GetAllAsync() |
|||
{ |
|||
var settingValues = new Dictionary<string, SettingValue>(); |
|||
var settingDefinitions = SettingDefinitionManager.GetAll(); |
|||
|
|||
foreach (var provider in Providers.Value) |
|||
{ |
|||
foreach (var setting in settingDefinitions) |
|||
{ |
|||
var value = await provider.GetOrNullAsync(setting, null); |
|||
if (value != null) |
|||
{ |
|||
settingValues[setting.Name] = new SettingValue(setting.Name, value); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return settingValues.Values.ToList(); |
|||
} |
|||
|
|||
public virtual async Task<List<SettingValue>> GetAllAsync(string providerName, string providerKey, bool fallback = true) |
|||
{ |
|||
Check.NotNull(providerName, nameof(providerName)); |
|||
|
|||
var settingValues = new Dictionary<string, SettingValue>(); |
|||
var settingDefinitions = SettingDefinitionManager.GetAll(); |
|||
var providers = Enumerable.Reverse(Providers.Value) |
|||
.SkipWhile(c => c.Name != providerName); |
|||
|
|||
if (!fallback) |
|||
{ |
|||
providers = providers.TakeWhile(c => c.Name == providerName); |
|||
} |
|||
|
|||
var providerList = providers.Reverse().ToList(); |
|||
|
|||
if (providerList.Any()) |
|||
{ |
|||
foreach (var setting in settingDefinitions) |
|||
{ |
|||
if (setting.IsInherited) |
|||
{ |
|||
foreach (var provider in providerList) |
|||
{ |
|||
var value = await provider.GetOrNullAsync(setting, providerKey); |
|||
if (value != null) |
|||
{ |
|||
settingValues[setting.Name] = new SettingValue(setting.Name, value); |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
settingValues[setting.Name] = new SettingValue( |
|||
setting.Name, |
|||
await providerList[0].GetOrNullAsync(setting, providerKey) |
|||
); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return settingValues.Values.ToList(); |
|||
} |
|||
|
|||
public virtual async Task SetAsync(string name, string value, string providerName, string providerKey, bool forceToSet = false) |
|||
{ |
|||
Check.NotNull(name, nameof(name)); |
|||
Check.NotNull(providerName, nameof(providerName)); |
|||
|
|||
var setting = SettingDefinitionManager.Get(name); |
|||
|
|||
var providers = Enumerable |
|||
.Reverse(Providers.Value) |
|||
.SkipWhile(p => p.Name != providerName) |
|||
.ToList(); |
|||
|
|||
if (!providers.Any()) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
if (providers.Count > 1 && !forceToSet && setting.IsInherited && value != null) |
|||
{ |
|||
//Clear the value if it's same as it's fallback value
|
|||
var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, providerKey); |
|||
if (fallbackValue == value) |
|||
{ |
|||
value = null; |
|||
} |
|||
} |
|||
|
|||
providers = providers |
|||
.TakeWhile(p => p.Name == providerName) |
|||
.ToList(); //Getting list for case of there are more than one provider with same EntityType
|
|||
|
|||
if (value == null) |
|||
{ |
|||
foreach (var provider in providers) |
|||
{ |
|||
await provider.ClearAsync(setting, providerKey); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
foreach (var provider in providers) |
|||
{ |
|||
await provider.SetAsync(setting, value, providerKey); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,8 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public static class SettingManagerSyncExtensions |
|||
{ |
|||
//TODO: Add sync extension methods for all setting manager methods.
|
|||
//TODO: Also add sync extension methods for all value provider extensions (like GlobalSettingManagerExtensions).
|
|||
} |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
using Volo.Abp.Collections; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingOptions |
|||
{ |
|||
public ITypeList<ISettingDefinitionProvider> DefinitionProviders { get; } |
|||
|
|||
public ITypeList<ISettingValueProvider> ValueProviders { get; } |
|||
|
|||
public SettingOptions() |
|||
{ |
|||
DefinitionProviders = new TypeList<ISettingDefinitionProvider>(); |
|||
ValueProviders = new TypeList<ISettingValueProvider> |
|||
{ |
|||
typeof(DefaultValueSettingValueProvider), |
|||
typeof(GlobalSettingValueProvider) |
|||
}; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingValue : NameValue |
|||
{ |
|||
/// <summary>
|
|||
/// Creates a new <see cref="NameValue"/>.
|
|||
/// </summary>
|
|||
public SettingValue() |
|||
{ |
|||
|
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a new <see cref="NameValue"/>.
|
|||
/// </summary>
|
|||
public SettingValue(string name, string value) |
|||
{ |
|||
Name = name; |
|||
Value = value; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public abstract class SettingValueProvider : ISettingValueProvider, ISingletonDependency |
|||
{ |
|||
public abstract string Name { get; } |
|||
|
|||
protected ISettingStore SettingStore { get; } |
|||
|
|||
protected SettingValueProvider(ISettingStore settingStore) |
|||
{ |
|||
SettingStore = settingStore; |
|||
} |
|||
|
|||
public abstract Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey); |
|||
|
|||
public abstract Task SetAsync(SettingDefinition setting, string value, string providerKey); |
|||
|
|||
public abstract Task ClearAsync(SettingDefinition setting, string providerKey); |
|||
} |
|||
} |
|||
@ -0,0 +1,25 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>netcoreapp2.0</TargetFramework> |
|||
<AssemblyName>Volo.Abp.MultiTenancy.Tests</AssemblyName> |
|||
<PackageId>Volo.Abp.MultiTenancy.Tests</PackageId> |
|||
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> |
|||
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> |
|||
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> |
|||
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> |
|||
<RootNamespace /> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" /> |
|||
<ProjectReference Include="..\..\src\Volo.Abp.Settings.EntityFrameworkCore\Volo.Abp.Settings.EntityFrameworkCore.csproj" /> |
|||
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.0.0" /> |
|||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
|||
@ -0,0 +1,45 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Volo.Abp.Session; |
|||
using Volo.Abp.Settings.EntityFrameworkCore; |
|||
using Volo.Abp.TestBase; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class AbpSettingsTestBase : AbpIntegratedTest<AbpSettingsTestModule> |
|||
{ |
|||
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) |
|||
{ |
|||
options.UseAutofac(); |
|||
} |
|||
|
|||
protected virtual void UsingDbContext(Action<IAbpSettingsDbContext> action) |
|||
{ |
|||
using (var dbContext = GetRequiredService<IAbpSettingsDbContext>()) |
|||
{ |
|||
action.Invoke(dbContext); |
|||
} |
|||
} |
|||
|
|||
protected virtual T UsingDbContext<T>(Func<IAbpSettingsDbContext, T> action) |
|||
{ |
|||
using (var dbContext = GetRequiredService<IAbpSettingsDbContext>()) |
|||
{ |
|||
return action.Invoke(dbContext); |
|||
} |
|||
} |
|||
|
|||
protected List<Setting> GetSettingsFromDbContext(string entityType, string entityId, string name) |
|||
{ |
|||
return UsingDbContext(context => |
|||
context.Settings.Where( |
|||
s => |
|||
s.ProviderName == UserSettingValueProvider.ProviderName && |
|||
s.ProviderKey == AbpIdentityTestDataBuilder.User1Id.ToString() && |
|||
s.Name == "MySetting2" |
|||
).ToList() |
|||
); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,61 @@ |
|||
using System; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.Autofac; |
|||
using Volo.Abp.EntityFrameworkCore; |
|||
using Volo.Abp.Modularity; |
|||
using Volo.Abp.Session; |
|||
using Volo.Abp.Settings.EntityFrameworkCore; |
|||
using Volo.Abp.Uow; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
[DependsOn( |
|||
typeof(AbpSettingsEntityFrameworkCoreModule), |
|||
typeof(AbpSessionModule), |
|||
typeof(AbpAutofacModule))] |
|||
public class AbpSettingsTestModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(IServiceCollection services) |
|||
{ |
|||
services.AddAssemblyOf<AbpSettingsTestModule>(); |
|||
|
|||
services.AddEntityFrameworkInMemoryDatabase(); |
|||
|
|||
var databaseName = Guid.NewGuid().ToString(); |
|||
|
|||
services.Configure<AbpDbContextOptions>(options => |
|||
{ |
|||
options.Configure(context => |
|||
{ |
|||
context.DbContextOptions.UseInMemoryDatabase(databaseName); |
|||
}); |
|||
}); |
|||
|
|||
services.Configure<UnitOfWorkDefaultOptions>(options => |
|||
{ |
|||
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions
|
|||
}); |
|||
|
|||
services.Configure<SettingOptions>(options => |
|||
{ |
|||
options.DefinitionProviders.Add<TestSettingDefinitionProvider>(); |
|||
}); |
|||
} |
|||
|
|||
public override void OnApplicationInitialization(ApplicationInitializationContext context) |
|||
{ |
|||
SeedTestData(context); |
|||
} |
|||
|
|||
private static void SeedTestData(ApplicationInitializationContext context) |
|||
{ |
|||
using (var scope = context.ServiceProvider.CreateScope()) |
|||
{ |
|||
scope.ServiceProvider |
|||
.GetRequiredService<AbpIdentityTestDataBuilder>() |
|||
.Build(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,34 @@ |
|||
using System; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Guids; |
|||
using Volo.Abp.Session; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class AbpIdentityTestDataBuilder : ITransientDependency |
|||
{ |
|||
public static Guid User1Id = Guid.NewGuid(); |
|||
public static Guid User2Id = Guid.NewGuid(); |
|||
|
|||
private readonly ISettingRepository _settingRepository; |
|||
private readonly IGuidGenerator _guidGenerator; |
|||
|
|||
public AbpIdentityTestDataBuilder(ISettingRepository settingRepository, IGuidGenerator guidGenerator) |
|||
{ |
|||
_settingRepository = settingRepository; |
|||
_guidGenerator = guidGenerator; |
|||
} |
|||
|
|||
public void Build() |
|||
{ |
|||
_settingRepository.InsertAsync(new Setting(_guidGenerator.Create(), "MySetting1", "42", GlobalSettingValueProvider.ProviderName)); |
|||
|
|||
_settingRepository.InsertAsync(new Setting(_guidGenerator.Create(), "MySetting2", "default-store-value", GlobalSettingValueProvider.ProviderName)); |
|||
_settingRepository.InsertAsync(new Setting(_guidGenerator.Create(), "MySetting2", "user1-store-value", UserSettingValueProvider.ProviderName, User1Id.ToString())); |
|||
_settingRepository.InsertAsync(new Setting(_guidGenerator.Create(), "MySetting2", "user2-store-value", UserSettingValueProvider.ProviderName, User2Id.ToString())); |
|||
|
|||
_settingRepository.InsertAsync(new Setting(_guidGenerator.Create(), "MySettingWithoutInherit", "default-store-value", GlobalSettingValueProvider.ProviderName)); |
|||
_settingRepository.InsertAsync(new Setting(_guidGenerator.Create(), "MySettingWithoutInherit", "user1-store-value", UserSettingValueProvider.ProviderName, User1Id.ToString())); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,55 @@ |
|||
using System.Threading.Tasks; |
|||
using Shouldly; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingManager_Basic_Tests : AbpSettingsTestBase |
|||
{ |
|||
private readonly ISettingManager _settingManager; |
|||
|
|||
public SettingManager_Basic_Tests() |
|||
{ |
|||
_settingManager = GetRequiredService<ISettingManager>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Throw_Exception_When_Try_To_Get_An_Undefined_Setting() |
|||
{ |
|||
await Assert.ThrowsAsync<AbpException>( |
|||
async () => await _settingManager.GetOrNullAsync("UndefinedSetting") |
|||
); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_Default_Value_If_Not_Set_In_Store() |
|||
{ |
|||
var value = await _settingManager.GetOrNullAsync("SettingNotSetInStore"); |
|||
value.ShouldBe("default-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_Base_Store_Value() |
|||
{ |
|||
(await _settingManager.GetOrNullAsync("MySetting1")).ShouldBe("42"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_All_Base_Store_Values() |
|||
{ |
|||
var settingValues = await _settingManager.GetAllAsync(); |
|||
settingValues.ShouldContain(sv => sv.Name == "MySetting1" && sv.Value == "42"); |
|||
settingValues.ShouldContain(sv => sv.Name == "MySetting2" && sv.Value == "default-store-value"); |
|||
settingValues.ShouldContain(sv => sv.Name == "SettingNotSetInStore" && sv.Value == "default-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Set_Global_Value() |
|||
{ |
|||
await _settingManager.SetGlobalAsync("MySetting1", "43"); |
|||
|
|||
(await _settingManager.GetOrNullGlobalAsync("MySetting1")).ShouldBe("43"); |
|||
(await _settingManager.GetOrNullAsync("MySetting1")).ShouldBe("43"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,185 @@ |
|||
using System; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using NSubstitute; |
|||
using Shouldly; |
|||
using Volo.Abp.Session; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingManager_User_Tests: AbpSettingsTestBase |
|||
{ |
|||
private Guid _currentUserId; |
|||
|
|||
private readonly ISettingManager _settingManager; |
|||
|
|||
public SettingManager_User_Tests() |
|||
{ |
|||
_settingManager = GetRequiredService<ISettingManager>(); |
|||
} |
|||
|
|||
protected override void AfterAddApplication(IServiceCollection services) |
|||
{ |
|||
var currentUser = Substitute.For<ICurrentUser>(); |
|||
currentUser.Id.Returns(ci => _currentUserId); |
|||
services.AddSingleton(currentUser); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_From_Store_For_Given_User() |
|||
{ |
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", AbpIdentityTestDataBuilder.User1Id)).ShouldBe("user1-store-value"); |
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", AbpIdentityTestDataBuilder.User2Id)).ShouldBe("user2-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Fallback_To_Default_Store_Value_When_No_Value_For_Given_User() |
|||
{ |
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", Guid.NewGuid())).ShouldBe("default-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Not_Fallback_To_Default_Store_Value_When_No_Value_For_Given_User_But_Specified_Fallback_As_False() |
|||
{ |
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", Guid.NewGuid(), fallback: false)).ShouldBeNull(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_From_Store_For_Current_User() |
|||
{ |
|||
_currentUserId = AbpIdentityTestDataBuilder.User1Id; |
|||
(await _settingManager.GetOrNullAsync("MySetting2")).ShouldBe("user1-store-value"); |
|||
|
|||
_currentUserId = AbpIdentityTestDataBuilder.User2Id; |
|||
(await _settingManager.GetOrNullAsync("MySetting2")).ShouldBe("user2-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Fallback_To_Default_Store_Value_When_No_Value_For_Current_User() |
|||
{ |
|||
_currentUserId = Guid.NewGuid(); |
|||
(await _settingManager.GetOrNullAsync("MySetting2")).ShouldBe("default-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_From_Store_For_Current_User_With_GetOrNullForCurrentUserAsync() |
|||
{ |
|||
_currentUserId = AbpIdentityTestDataBuilder.User1Id; |
|||
(await _settingManager.GetOrNullForCurrentUserAsync("MySetting2")).ShouldBe("user1-store-value"); |
|||
|
|||
_currentUserId = AbpIdentityTestDataBuilder.User2Id; |
|||
(await _settingManager.GetOrNullForCurrentUserAsync("MySetting2")).ShouldBe("user2-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Fallback_To_Default_Store_Value_When_No_Value_For_Current_User_With_GetOrNullForCurrentUserAsync() |
|||
{ |
|||
_currentUserId = Guid.NewGuid(); |
|||
(await _settingManager.GetOrNullAsync("MySetting2")).ShouldBe("default-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Not_Fallback_To_Default_Store_Value_When_No_Value_For_Current_User_But_Specified_Fallback_As_False() |
|||
{ |
|||
_currentUserId = Guid.NewGuid(); |
|||
(await _settingManager.GetOrNullForCurrentUserAsync("MySetting2", fallback: false)).ShouldBeNull(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_All_From_Store_For_Given_User() |
|||
{ |
|||
var settingValues = await _settingManager.GetAllForUserAsync(AbpIdentityTestDataBuilder.User1Id); |
|||
settingValues.ShouldContain(sv => sv.Name == "MySetting1" && sv.Value == "42"); |
|||
settingValues.ShouldContain(sv => sv.Name == "MySetting2" && sv.Value == "user1-store-value"); |
|||
settingValues.ShouldContain(sv => sv.Name == "SettingNotSetInStore" && sv.Value == "default-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_All_From_Store_For_Given_User_Without_Fallback() |
|||
{ |
|||
var settingValues = await _settingManager.GetAllForUserAsync(AbpIdentityTestDataBuilder.User1Id, fallback: false); |
|||
settingValues.ShouldContain(sv => sv.Name == "MySetting2" && sv.Value == "user1-store-value"); |
|||
settingValues.ShouldContain(sv => sv.Name == "MySettingWithoutInherit" && sv.Value == "user1-store-value"); |
|||
settingValues.ShouldNotContain(sv => sv.Name == "MySetting1"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Delete_Setting_Record_When_Set_To_Null() |
|||
{ |
|||
await _settingManager.SetForUserAsync(AbpIdentityTestDataBuilder.User1Id, "MySetting2", null); |
|||
|
|||
GetSettingsFromDbContext( |
|||
UserSettingValueProvider.ProviderName, |
|||
AbpIdentityTestDataBuilder.User1Id.ToString(), |
|||
"MySetting2" |
|||
).Count.ShouldBe(0); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Change_User_Setting() |
|||
{ |
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", AbpIdentityTestDataBuilder.User1Id)) |
|||
.ShouldBe("user1-store-value"); |
|||
|
|||
await _settingManager.SetForUserAsync(AbpIdentityTestDataBuilder.User1Id, "MySetting2", "user1-new-store-value"); |
|||
|
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", AbpIdentityTestDataBuilder.User1Id)) |
|||
.ShouldBe("user1-new-store-value"); |
|||
|
|||
GetSettingsFromDbContext( |
|||
UserSettingValueProvider.ProviderName, |
|||
AbpIdentityTestDataBuilder.User1Id.ToString(), |
|||
"MySetting2" |
|||
).Single().Value.ShouldBe("user1-new-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Delete_Setting_Record_When_Set_To_Fallback_Value() |
|||
{ |
|||
await _settingManager.SetForUserAsync( |
|||
AbpIdentityTestDataBuilder.User1Id, |
|||
"MySetting2", |
|||
"default-store-value" |
|||
); |
|||
|
|||
GetSettingsFromDbContext( |
|||
UserSettingValueProvider.ProviderName, |
|||
AbpIdentityTestDataBuilder.User1Id.ToString(), |
|||
"MySetting2" |
|||
).Count.ShouldBe(0); |
|||
|
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", AbpIdentityTestDataBuilder.User1Id)) |
|||
.ShouldBe("default-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Not_Delete_Setting_Record_When_Set_To_Fallback_Value_If_Forced() |
|||
{ |
|||
await _settingManager.SetForUserAsync( |
|||
AbpIdentityTestDataBuilder.User1Id, |
|||
"MySetting2", |
|||
"default-store-value", |
|||
forceToSet: true |
|||
); |
|||
|
|||
GetSettingsFromDbContext( |
|||
UserSettingValueProvider.ProviderName, |
|||
AbpIdentityTestDataBuilder.User1Id.ToString(), |
|||
"MySetting2" |
|||
).Single().Value.ShouldBe("default-store-value"); |
|||
|
|||
(await _settingManager.GetOrNullForUserAsync("MySetting2", AbpIdentityTestDataBuilder.User1Id)) |
|||
.ShouldBe("default-store-value"); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_For_Given_User_For_Non_Inherited_Setting() |
|||
{ |
|||
(await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", AbpIdentityTestDataBuilder.User1Id)).ShouldBe("user1-store-value"); |
|||
(await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", AbpIdentityTestDataBuilder.User2Id)).ShouldBeNull(); //Does not inherit!
|
|||
(await _settingManager.GetOrNullGlobalAsync("MySettingWithoutInherit")).ShouldBe("default-store-value"); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class TestSettingDefinitionProvider : SettingDefinitionProvider |
|||
{ |
|||
public override void Define(ISettingDefinitionContext context) |
|||
{ |
|||
context.Add(new SettingDefinition("MySetting1")); |
|||
context.Add(new SettingDefinition("MySetting2")); |
|||
context.Add(new SettingDefinition("MySettingWithoutInherit", isInherited: false)); |
|||
context.Add(new SettingDefinition("SettingNotSetInStore", defaultValue: "default-value")); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue