Browse Source

SettingValueProvider with duplicate names is not allowed

pull/18823/head
liangshiwei 3 years ago
parent
commit
dc33781ed7
  1. 16
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProviderManager.cs
  2. 64
      framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingValueProviderManager_Tests.cs

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

@ -9,7 +9,8 @@ namespace Volo.Abp.Settings;
public class SettingValueProviderManager : ISettingValueProviderManager, ISingletonDependency
{
public List<ISettingValueProvider> Providers => _lazyProviders.Value;
public List<ISettingValueProvider> Providers => GetProviders();
protected AbpSettingOptions Options { get; }
private readonly Lazy<List<ISettingValueProvider>> _lazyProviders;
@ -28,4 +29,17 @@ public class SettingValueProviderManager : ISettingValueProviderManager, ISingle
true
);
}
protected virtual List<ISettingValueProvider> GetProviders()
{
var providers = _lazyProviders.Value;
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)}");
}
return providers;
}
}

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

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using NSubstitute.Extensions;
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<Test2SettingValueProvider>();
});
}
[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: Test. Providers:{Environment.NewLine}Volo.Abp.Settings.Test2SettingValueProvider{Environment.NewLine}Volo.Abp.Settings.TestSettingValueProvider");
}
}
public class Test2SettingValueProvider : ISettingValueProvider, ITransientDependency
{
public const string ProviderName = "Test";
public string Name => ProviderName;
public Test2SettingValueProvider()
{
}
public Task<string> GetOrNullAsync(SettingDefinition setting)
{
throw new NotImplementedException();
}
public Task<List<SettingValue>> GetAllAsync(SettingDefinition[] settings)
{
throw new NotImplementedException();
}
}
Loading…
Cancel
Save