Browse Source

Merge pull request #18823 from abpframework/liangshiwei/settings

Improve `ValueProvider` system.
pull/18891/head
maliming 2 years ago
committed by GitHub
parent
commit
fee3a93a8e
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 26
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionValueProviderManager.cs
  2. 20
      framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs
  3. 43
      framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureValueProviderManager.cs
  4. 8
      framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureValueProviderManager.cs
  5. 27
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProviderManager.cs
  6. 59
      framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionValueProviderManager_Tests.cs
  7. 54
      framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureValueProviderManager_Tests.cs
  8. 62
      framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingValueProviderManager_Tests.cs
  9. 2
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs
  10. 11
      modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo/Abp/FeatureManagement/FeatureManager_Tests.cs
  11. 15
      modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs
  12. 2
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs
  13. 12
      modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_Basic_Tests.cs

26
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionValueProviderManager.cs

@ -13,19 +13,31 @@ public class PermissionValueProviderManager : IPermissionValueProviderManager, I
private readonly Lazy<List<IPermissionValueProvider>> _lazyProviders; private readonly Lazy<List<IPermissionValueProvider>> _lazyProviders;
protected AbpPermissionOptions Options { get; } protected AbpPermissionOptions Options { get; }
protected IServiceProvider ServiceProvider { get; }
public PermissionValueProviderManager( public PermissionValueProviderManager(
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
IOptions<AbpPermissionOptions> options) IOptions<AbpPermissionOptions> options)
{ {
Options = options.Value; Options = options.Value;
ServiceProvider = serviceProvider;
_lazyProviders = new Lazy<List<IPermissionValueProvider>>( _lazyProviders = new Lazy<List<IPermissionValueProvider>>(GetProviders, true);
() => Options }
.ValueProviders
.Select(c => serviceProvider.GetRequiredService(c) as IPermissionValueProvider) protected virtual List<IPermissionValueProvider> GetProviders()
.ToList()!, {
true var providers = Options
); .ValueProviders
.Select(type => (ServiceProvider.GetRequiredService(type) as IPermissionValueProvider)!)
.ToList();
var multipleProviders = providers.GroupBy(p => p.Name).FirstOrDefault(x => x.Count() > 1);
if(multipleProviders != null)
{
throw new AbpException($"Duplicate permission value provider name detected: {multipleProviders.Key}. Providers:{Environment.NewLine}{multipleProviders.Select(p => p.GetType().FullName!).JoinAsString(Environment.NewLine)}");
}
return providers;
} }
} }

20
framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs

@ -12,34 +12,26 @@ public class FeatureChecker : FeatureCheckerBase
protected AbpFeatureOptions Options { get; } protected AbpFeatureOptions Options { get; }
protected IServiceProvider ServiceProvider { get; } protected IServiceProvider ServiceProvider { get; }
protected IFeatureDefinitionManager FeatureDefinitionManager { get; } protected IFeatureDefinitionManager FeatureDefinitionManager { get; }
protected List<IFeatureValueProvider> Providers => _providers.Value; protected IFeatureValueProviderManager FeatureValueProviderManager { get; }
private readonly Lazy<List<IFeatureValueProvider>> _providers;
public FeatureChecker( public FeatureChecker(
IOptions<AbpFeatureOptions> options, IOptions<AbpFeatureOptions> options,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
IFeatureDefinitionManager featureDefinitionManager) IFeatureDefinitionManager featureDefinitionManager,
IFeatureValueProviderManager featureValueProviderManager)
{ {
ServiceProvider = serviceProvider; ServiceProvider = serviceProvider;
FeatureDefinitionManager = featureDefinitionManager; FeatureDefinitionManager = featureDefinitionManager;
FeatureValueProviderManager = featureValueProviderManager;
Options = options.Value; Options = options.Value;
_providers = new Lazy<List<IFeatureValueProvider>>(
() => Options
.ValueProviders
.Select(type => (ServiceProvider.GetRequiredService(type) as IFeatureValueProvider)!)
.ToList(),
true
);
} }
public override async Task<string?> GetOrNullAsync(string name) public override async Task<string?> GetOrNullAsync(string name)
{ {
var featureDefinition = await FeatureDefinitionManager.GetAsync(name); var featureDefinition = await FeatureDefinitionManager.GetAsync(name);
var providers = Enumerable var providers = FeatureValueProviderManager.ValueProviders
.Reverse(Providers); .Reverse();
if (featureDefinition.AllowedProviders.Any()) if (featureDefinition.AllowedProviders.Any())
{ {

43
framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureValueProviderManager.cs

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Features;
public class FeatureValueProviderManager : IFeatureValueProviderManager, ISingletonDependency
{
public IReadOnlyList<IFeatureValueProvider> ValueProviders => _lazyProviders.Value;
private readonly Lazy<List<IFeatureValueProvider>> _lazyProviders;
protected AbpFeatureOptions Options { get; }
protected IServiceProvider ServiceProvider { get; }
public FeatureValueProviderManager(
IServiceProvider serviceProvider,
IOptions<AbpFeatureOptions> options)
{
Options = options.Value;
ServiceProvider = serviceProvider;
_lazyProviders = new Lazy<List<IFeatureValueProvider>>(GetProviders, true);
}
protected virtual List<IFeatureValueProvider> GetProviders()
{
var providers = Options
.ValueProviders
.Select(type => (ServiceProvider.GetRequiredService(type) as IFeatureValueProvider)!)
.ToList();
var multipleProviders = providers.GroupBy(p => p.Name).FirstOrDefault(x => x.Count() > 1);
if(multipleProviders != null)
{
throw new AbpException($"Duplicate feature value provider name detected: {multipleProviders.Key}. Providers:{Environment.NewLine}{multipleProviders.Select(p => p.GetType().FullName!).JoinAsString(Environment.NewLine)}");
}
return providers;
}
}

8
framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureValueProviderManager.cs

@ -0,0 +1,8 @@
using System.Collections.Generic;
namespace Volo.Abp.Features;
public interface IFeatureValueProviderManager
{
IReadOnlyList<IFeatureValueProvider> ValueProviders { get; }
}

27
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProviderManager.cs

@ -10,7 +10,9 @@ namespace Volo.Abp.Settings;
public class SettingValueProviderManager : ISettingValueProviderManager, ISingletonDependency public class SettingValueProviderManager : ISettingValueProviderManager, ISingletonDependency
{ {
public List<ISettingValueProvider> Providers => _lazyProviders.Value; public List<ISettingValueProvider> Providers => _lazyProviders.Value;
protected AbpSettingOptions Options { get; } protected AbpSettingOptions Options { get; }
protected IServiceProvider ServiceProvider { get; }
private readonly Lazy<List<ISettingValueProvider>> _lazyProviders; private readonly Lazy<List<ISettingValueProvider>> _lazyProviders;
public SettingValueProviderManager( public SettingValueProviderManager(
@ -19,13 +21,24 @@ public class SettingValueProviderManager : ISettingValueProviderManager, ISingle
{ {
Options = options.Value; Options = options.Value;
ServiceProvider = serviceProvider;
_lazyProviders = new Lazy<List<ISettingValueProvider>>(GetProviders, true);
}
protected virtual List<ISettingValueProvider> GetProviders()
{
var providers = Options
.ValueProviders
.Select(type => (ServiceProvider.GetRequiredService(type) as ISettingValueProvider)!)
.ToList();
var multipleProviders = providers.GroupBy(p => p.Name).FirstOrDefault(x => x.Count() > 1);
if(multipleProviders != null)
{
throw new AbpException($"Duplicate setting value provider name detected: {multipleProviders.Key}. Providers:{Environment.NewLine}{multipleProviders.Select(p => p.GetType().FullName!).JoinAsString(Environment.NewLine)}");
}
_lazyProviders = new Lazy<List<ISettingValueProvider>>( return providers;
() => Options
.ValueProviders
.Select(type => serviceProvider.GetRequiredService(type) as ISettingValueProvider)
.ToList()!,
true
);
} }
} }

59
framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/PermissionValueProviderManager_Tests.cs

@ -0,0 +1,59 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Authorization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Authorization.TestServices;
using Xunit;
namespace Volo.Abp;
public class PermissionValueProviderManager_Tests: AuthorizationTestBase
{
private readonly IPermissionValueProviderManager _permissionValueProviderManager;
public PermissionValueProviderManager_Tests()
{
_permissionValueProviderManager = GetRequiredService<IPermissionValueProviderManager>();
}
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.Services.Configure<AbpPermissionOptions>(permissionOptions =>
{
permissionOptions.ValueProviders.Add<TestDuplicatePermissionValueProvider>();
});
}
[Fact]
public void Should_Throw_Exception_If_Duplicate_Provider_Name_Detected()
{
var exception = Assert.Throws<AbpException>(() =>
{
var providers = _permissionValueProviderManager.ValueProviders;
});
exception.Message.ShouldBe($"Duplicate permission value provider name detected: TestPermissionValueProvider1. Providers:{Environment.NewLine}{typeof(TestDuplicatePermissionValueProvider).FullName}{Environment.NewLine}{typeof(TestPermissionValueProvider1).FullName}");
}
}
public class TestDuplicatePermissionValueProvider : PermissionValueProvider
{
public TestDuplicatePermissionValueProvider(IPermissionStore permissionStore) : base(permissionStore)
{
}
public override string Name => "TestPermissionValueProvider1";
public override Task<PermissionGrantResult> CheckAsync(PermissionValueCheckContext context)
{
throw new NotImplementedException();
}
public override Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context)
{
throw new NotImplementedException();
}
}

54
framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureValueProviderManager_Tests.cs

@ -0,0 +1,54 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Xunit;
namespace Volo.Abp.Features;
public class FeatureValueProviderManager_Tests : FeatureTestBase
{
private readonly IFeatureValueProviderManager _featureValueProviderManager;
public FeatureValueProviderManager_Tests()
{
_featureValueProviderManager = GetRequiredService<IFeatureValueProviderManager>();
}
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.Services.Configure<AbpFeatureOptions>(permissionOptions =>
{
permissionOptions.ValueProviders.Add<TestDuplicateFeatureValueProvider>();
});
}
[Fact]
public void Should_Throw_Exception_If_Duplicate_Provider_Name_Detected()
{
var exception = Assert.Throws<AbpException>(() =>
{
var providers = _featureValueProviderManager.ValueProviders;
});
exception.Message.ShouldBe($"Duplicate feature value provider name detected: {TestDuplicateFeatureValueProvider.ProviderName}. Providers:{Environment.NewLine}{typeof(TestDuplicateFeatureValueProvider).FullName}{Environment.NewLine}{typeof(DefaultValueFeatureValueProvider).FullName}");
}
}
public class TestDuplicateFeatureValueProvider : FeatureValueProvider
{
public const string ProviderName = "D";
public override string Name => ProviderName;
public TestDuplicateFeatureValueProvider(IFeatureStore settingStore)
: base(settingStore)
{
}
public override Task<string> GetOrNullAsync(FeatureDefinition setting)
{
throw new NotImplementedException();
}
}

62
framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingValueProviderManager_Tests.cs

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Testing;
using Xunit;
namespace Volo.Abp.Settings;
public class SettingValueProviderManager_Tests: AbpIntegratedTest<AbpSettingsTestModule>
{
private readonly ISettingValueProviderManager _settingValueProviderManager;
public SettingValueProviderManager_Tests()
{
_settingValueProviderManager = GetRequiredService<ISettingValueProviderManager>();
}
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
options.Services.Configure<AbpSettingOptions>(settingOptions =>
{
settingOptions.ValueProviders.Add<TestDuplicateSettingValueProvider>();
});
}
[Fact]
public void Should_Throw_Exception_If_Duplicate_Provider_Name_Detected()
{
var exception = Assert.Throws<AbpException>(() =>
{
var providers = _settingValueProviderManager.Providers;
});
exception.Message.ShouldBe($"Duplicate setting value provider name detected: {TestDuplicateSettingValueProvider.ProviderName}. Providers:{Environment.NewLine}{typeof(TestDuplicateSettingValueProvider).FullName}{Environment.NewLine}{typeof(TestSettingValueProvider).FullName}");
}
}
public class TestDuplicateSettingValueProvider : ISettingValueProvider, ITransientDependency
{
public const string ProviderName = "Test";
public string Name => ProviderName;
public TestDuplicateSettingValueProvider()
{
}
public Task<string> GetOrNullAsync(SettingDefinition setting)
{
throw new NotImplementedException();
}
public Task<List<SettingValue>> GetAllAsync(SettingDefinition[] settings)
{
throw new NotImplementedException();
}
}

2
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs

@ -144,7 +144,7 @@ public class FeatureManager : IFeatureManager, ISingletonDependency
if (!providers.Any()) if (!providers.Any())
{ {
return; throw new AbpException($"Unknown feature value provider: {providerName}");
} }
if (providers.Count > 1 && !forceToSet && value != null) if (providers.Count > 1 && !forceToSet && value != null)

11
modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo/Abp/FeatureManagement/FeatureManager_Tests.cs

@ -209,4 +209,15 @@ public class FeatureManager_Tests : FeatureManagementDomainTestBase
(await _featureManager.GetOrNullAsync(TestFeatureDefinitionProvider.BackupCount, TenantFeatureValueProvider.ProviderName, TestEditionIds.TenantId.ToString())).ShouldBe("0"); (await _featureManager.GetOrNullAsync(TestFeatureDefinitionProvider.BackupCount, TenantFeatureValueProvider.ProviderName, TestEditionIds.TenantId.ToString())).ShouldBe("0");
} }
[Fact]
public async Task Set_Should_Throw_Exception_If_Provider_Not_Found()
{
var exception = await Assert.ThrowsAsync<AbpException>(async () =>
{
await _featureManager.SetAsync(TestFeatureDefinitionProvider.EmailSupport, "true", "UndefinedProvider", "Test");
});
exception.Message.ShouldBe("Unknown feature value provider: UndefinedProvider");
}
} }

15
modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs

@ -134,6 +134,21 @@ public class PermissionManager_Tests : PermissionTestBase
"Test", "Test",
true); true);
} }
[Fact]
public async Task Set_Should_Throw_Exception_If_Provider_Not_Found()
{
var exception = await Assert.ThrowsAsync<AbpException>(async () =>
{
await _permissionManager.SetAsync(
"MyPermission1",
"UndefinedProvider",
"Test",
true);
});
exception.Message.ShouldBe("Unknown permission management provider: UndefinedProvider");
}
[Fact] [Fact]
public async Task UpdateProviderKey() public async Task UpdateProviderKey()

2
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs

@ -125,7 +125,7 @@ public class SettingManager : ISettingManager, ISingletonDependency
if (!providers.Any()) if (!providers.Any())
{ {
return; throw new AbpException($"Unknown setting value provider: {providerName}");
} }
if (setting.IsEncrypted) if (setting.IsEncrypted)

12
modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_Basic_Tests.cs

@ -1,3 +1,4 @@
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Shouldly; using Shouldly;
using Volo.Abp.Settings; using Volo.Abp.Settings;
@ -63,4 +64,15 @@ public class SettingManager_Basic_Tests : SettingsTestBase
(await _settingManager.GetOrNullGlobalAsync("MySetting1")).ShouldBe("43"); (await _settingManager.GetOrNullGlobalAsync("MySetting1")).ShouldBe("43");
(await _settingProvider.GetOrNullAsync("MySetting1")).ShouldBe("43"); (await _settingProvider.GetOrNullAsync("MySetting1")).ShouldBe("43");
} }
[Fact]
public async Task Set_Should_Throw_Exception_If_Provider_Not_Found()
{
var exception = await Assert.ThrowsAsync<AbpException>(async () =>
{
await _settingManager.SetAsync("MySetting1", "43", "UndefinedProvider", "Test");
});
exception.Message.ShouldBe("Unknown setting value provider: UndefinedProvider");
}
} }
Loading…
Cancel
Save