|
|
@ -3,6 +3,7 @@ using System.Collections.Generic; |
|
|
using System.Linq; |
|
|
using System.Linq; |
|
|
using System.Threading.Tasks; |
|
|
using System.Threading.Tasks; |
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
|
|
|
using Microsoft.Extensions.Localization; |
|
|
using Microsoft.Extensions.Options; |
|
|
using Microsoft.Extensions.Options; |
|
|
using Volo.Abp.DependencyInjection; |
|
|
using Volo.Abp.DependencyInjection; |
|
|
using Volo.Abp.Features; |
|
|
using Volo.Abp.Features; |
|
|
@ -14,15 +15,18 @@ namespace Volo.Abp.FeatureManagement |
|
|
protected IFeatureDefinitionManager FeatureDefinitionManager { get; } |
|
|
protected IFeatureDefinitionManager FeatureDefinitionManager { get; } |
|
|
protected List<IFeatureManagementProvider> Providers => _lazyProviders.Value; |
|
|
protected List<IFeatureManagementProvider> Providers => _lazyProviders.Value; |
|
|
protected FeatureManagementOptions Options { get; } |
|
|
protected FeatureManagementOptions Options { get; } |
|
|
|
|
|
protected IStringLocalizerFactory StringLocalizerFactory { get; } |
|
|
|
|
|
|
|
|
private readonly Lazy<List<IFeatureManagementProvider>> _lazyProviders; |
|
|
private readonly Lazy<List<IFeatureManagementProvider>> _lazyProviders; |
|
|
|
|
|
|
|
|
public FeatureManager( |
|
|
public FeatureManager( |
|
|
IOptions<FeatureManagementOptions> options, |
|
|
IOptions<FeatureManagementOptions> options, |
|
|
IServiceProvider serviceProvider, |
|
|
IServiceProvider serviceProvider, |
|
|
IFeatureDefinitionManager featureDefinitionManager) |
|
|
IFeatureDefinitionManager featureDefinitionManager, |
|
|
|
|
|
IStringLocalizerFactory stringLocalizerFactory) |
|
|
{ |
|
|
{ |
|
|
FeatureDefinitionManager = featureDefinitionManager; |
|
|
FeatureDefinitionManager = featureDefinitionManager; |
|
|
|
|
|
StringLocalizerFactory = stringLocalizerFactory; |
|
|
Options = options.Value; |
|
|
Options = options.Value; |
|
|
|
|
|
|
|
|
//TODO: Instead, use IHybridServiceScopeFactory and create a scope..?
|
|
|
//TODO: Instead, use IHybridServiceScopeFactory and create a scope..?
|
|
|
@ -57,7 +61,8 @@ namespace Volo.Abp.FeatureManagement |
|
|
.Select(x => new FeatureNameValue(x.Name, x.Value)).ToList(); |
|
|
.Select(x => new FeatureNameValue(x.Name, x.Value)).ToList(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public async Task<FeatureNameValueWithGrantedProvider> GetOrNullWithProviderAsync(string name, string providerName, string providerKey, bool fallback = true) |
|
|
public async Task<FeatureNameValueWithGrantedProvider> GetOrNullWithProviderAsync(string name, |
|
|
|
|
|
string providerName, string providerKey, bool fallback = true) |
|
|
{ |
|
|
{ |
|
|
Check.NotNull(name, nameof(name)); |
|
|
Check.NotNull(name, nameof(name)); |
|
|
Check.NotNull(providerName, nameof(providerName)); |
|
|
Check.NotNull(providerName, nameof(providerName)); |
|
|
@ -65,7 +70,8 @@ namespace Volo.Abp.FeatureManagement |
|
|
return await GetOrNullInternalAsync(name, providerName, providerKey, fallback); |
|
|
return await GetOrNullInternalAsync(name, providerName, providerKey, fallback); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public async Task<List<FeatureNameValueWithGrantedProvider>> GetAllWithProviderAsync(string providerName, string providerKey, bool fallback = true) |
|
|
public async Task<List<FeatureNameValueWithGrantedProvider>> GetAllWithProviderAsync(string providerName, |
|
|
|
|
|
string providerKey, bool fallback = true) |
|
|
{ |
|
|
{ |
|
|
Check.NotNull(providerName, nameof(providerName)); |
|
|
Check.NotNull(providerName, nameof(providerName)); |
|
|
|
|
|
|
|
|
@ -128,6 +134,11 @@ namespace Volo.Abp.FeatureManagement |
|
|
|
|
|
|
|
|
var feature = FeatureDefinitionManager.Get(name); |
|
|
var feature = FeatureDefinitionManager.Get(name); |
|
|
|
|
|
|
|
|
|
|
|
if (!feature.ValueType.Validator.IsValid(value)) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new FeatureValueInvalidException(feature.DisplayName.Localize(StringLocalizerFactory)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
var providers = Enumerable |
|
|
var providers = Enumerable |
|
|
.Reverse(Providers) |
|
|
.Reverse(Providers) |
|
|
.SkipWhile(p => p.Name != providerName) |
|
|
.SkipWhile(p => p.Name != providerName) |
|
|
|