mirror of https://github.com/abpframework/abp.git
13 changed files with 256 additions and 17 deletions
@ -0,0 +1,13 @@ |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public interface ISettingProvider |
|||
{ |
|||
Task<string> GetOrNullAsync([NotNull]string name); |
|||
|
|||
Task<List<SettingValue>> GetAllAsync(); |
|||
} |
|||
} |
|||
@ -0,0 +1,102 @@ |
|||
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 SettingProvider : ISettingProvider, ITransientDependency |
|||
{ |
|||
protected ISettingDefinitionManager SettingDefinitionManager { get; } |
|||
protected Lazy<List<ISettingValueProvider>> Providers { get; } |
|||
protected ISettingEncryptionService SettingEncryptionService { get; } |
|||
protected SettingOptions Options { get; } |
|||
|
|||
public SettingProvider( |
|||
IOptions<SettingOptions> options, |
|||
IServiceProvider serviceProvider, |
|||
ISettingDefinitionManager settingDefinitionManager, |
|||
ISettingEncryptionService settingEncryptionService) |
|||
{ |
|||
SettingDefinitionManager = settingDefinitionManager; |
|||
SettingEncryptionService = settingEncryptionService; |
|||
|
|||
Options = options.Value; |
|||
|
|||
Providers = new Lazy<List<ISettingValueProvider>>( |
|||
() => Options |
|||
.ValueProviders |
|||
.Select(c => serviceProvider.GetRequiredService(c) as ISettingValueProvider) |
|||
.ToList(), |
|||
true |
|||
); |
|||
} |
|||
|
|||
public virtual async Task<string> GetOrNullAsync(string name) |
|||
{ |
|||
var setting = SettingDefinitionManager.Get(name); |
|||
var providers = Enumerable |
|||
.Reverse(Providers.Value); |
|||
|
|||
if (setting.Providers.Any()) |
|||
{ |
|||
providers = providers.Where(p => setting.Providers.Contains(p.Name)); |
|||
} |
|||
|
|||
//TODO: How to implement setting.IsInherited?
|
|||
|
|||
var value = await GetOrNullValueFromProvidersAsync(null, providers, setting); |
|||
if (setting.IsEncrypted) |
|||
{ |
|||
value = SettingEncryptionService.Decrypt(setting, value); |
|||
} |
|||
|
|||
return value; |
|||
} |
|||
|
|||
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) |
|||
{ |
|||
if (setting.IsEncrypted) |
|||
{ |
|||
value = SettingEncryptionService.Decrypt(setting, value); |
|||
} |
|||
|
|||
settingValues[setting.Name] = new SettingValue(setting.Name, value); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return settingValues.Values.ToList(); |
|||
} |
|||
|
|||
protected virtual async Task<string> GetOrNullValueFromProvidersAsync( |
|||
string providerKey, |
|||
IEnumerable<ISettingValueProvider> providers, |
|||
SettingDefinition setting) |
|||
{ |
|||
foreach (var provider in providers) |
|||
{ |
|||
var value = await provider.GetOrNullAsync(setting, providerKey); |
|||
if (value != null) |
|||
{ |
|||
return value; |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,56 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Threading.Tasks; |
|||
using JetBrains.Annotations; |
|||
using Volo.Abp.Threading; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public static class SettingProviderExtensions |
|||
{ |
|||
public static async Task<bool> IsTrueAsync([NotNull] this ISettingProvider settingProvider, [NotNull] string name) |
|||
{ |
|||
Check.NotNull(settingProvider, nameof(settingProvider)); |
|||
Check.NotNull(name, nameof(name)); |
|||
|
|||
return string.Equals( |
|||
await settingProvider.GetOrNullAsync(name), |
|||
"true", |
|||
StringComparison.OrdinalIgnoreCase |
|||
); |
|||
} |
|||
|
|||
public static async Task<T> GetAsync<T>([NotNull] this ISettingProvider settingProvider, [NotNull] string name, T defaultValue = default) |
|||
where T : struct |
|||
{ |
|||
Check.NotNull(settingProvider, nameof(settingProvider)); |
|||
Check.NotNull(name, nameof(name)); |
|||
|
|||
var value = await settingProvider.GetOrNullAsync(name); |
|||
return value?.To<T>() ?? defaultValue; |
|||
} |
|||
|
|||
public static string GetOrNull([NotNull] this ISettingProvider settingProvider, [NotNull] string name) |
|||
{ |
|||
Check.NotNull(settingProvider, nameof(settingProvider)); |
|||
return AsyncHelper.RunSync(() => settingProvider.GetOrNullAsync(name)); |
|||
} |
|||
|
|||
public static List<SettingValue> GetAll([NotNull] this ISettingProvider settingProvider) |
|||
{ |
|||
Check.NotNull(settingProvider, nameof(settingProvider)); |
|||
return AsyncHelper.RunSync(settingProvider.GetAllAsync); |
|||
} |
|||
|
|||
public static T Get<T>([NotNull] this ISettingProvider settingProvider, [NotNull] string name, T defaultValue = default) |
|||
where T : struct |
|||
{ |
|||
return AsyncHelper.RunSync(() => settingProvider.GetAsync(name, defaultValue)); |
|||
} |
|||
|
|||
public static bool IsTrue([NotNull] this ISettingProvider settingProvider, [NotNull] string name) |
|||
{ |
|||
return AsyncHelper.RunSync(() => settingProvider.IsTrueAsync(name)); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
using System.Threading.Tasks; |
|||
using Shouldly; |
|||
using Xunit; |
|||
|
|||
namespace Volo.Abp.Settings |
|||
{ |
|||
public class SettingProvider_Tests : AbpIntegratedTest<AbpSettingsTestModule> |
|||
{ |
|||
private readonly ISettingProvider _settingProvider; |
|||
|
|||
public SettingProvider_Tests() |
|||
{ |
|||
_settingProvider = GetRequiredService<ISettingProvider>(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_Null_If_No_Value_Provided_And_No_Default_Value() |
|||
{ |
|||
(await _settingProvider.GetOrNullAsync(TestSettingNames.TestSettingWithoutDefaultValue)) |
|||
.ShouldBeNull(); |
|||
} |
|||
|
|||
[Fact] |
|||
public async Task Should_Get_Default_Value_If_No_Value_Provided_And_There_Is_A_Default_Value() |
|||
{ |
|||
(await _settingProvider.GetOrNullAsync(TestSettingNames.TestSettingWithDefaultValue)) |
|||
.ShouldBe("default-value"); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue