Auto register setting definition providers.

pull/859/head
Halil ibrahim Kalkan 7 years ago
parent 986a220c07
commit dda709bcb4

@ -18,11 +18,6 @@ namespace Volo.Abp.Emailing
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<SettingOptions>(options =>
{
options.DefinitionProviders.Add<EmailSettingProvider>();
});
Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpEmailingModule>();

@ -27,11 +27,6 @@ namespace Volo.Abp.Localization
.Add<AbpValidationResource>("en")
.AddVirtualJson("/Localization/Resources/AbpValidation");
});
Configure<SettingOptions>(options =>
{
options.DefinitionProviders.Add<LocalizationSettingProvider>();
});
}
}
}

@ -1,4 +1,7 @@
using Volo.Abp.Localization;
using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security;
@ -12,6 +15,11 @@ namespace Volo.Abp.Settings
)]
public class AbpSettingsModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
AutoAddDefinitionProviders(context.Services);
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<SettingOptions>(options =>
@ -22,5 +30,23 @@ namespace Volo.Abp.Settings
options.ValueProviders.Add<UserSettingValueProvider>();
});
}
private static void AutoAddDefinitionProviders(IServiceCollection services)
{
var definitionProviders = new List<Type>();
services.OnRegistred(context =>
{
if (typeof(ISettingDefinitionProvider).IsAssignableFrom(context.ImplementationType))
{
definitionProviders.Add(context.ImplementationType);
}
});
services.Configure<SettingOptions>(options =>
{
options.DefinitionProviders.AddIfNotContains(definitionProviders);
});
}
}
}

@ -10,22 +10,19 @@ 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;
protected IServiceProvider ServiceProvider { get; }
public SettingDefinitionManager(
IOptions<SettingOptions> options,
IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
ServiceProvider = serviceProvider;
Options = options.Value;
Providers = new Lazy<List<ISettingDefinitionProvider>>(CreateSettingProviders, true);
SettingDefinitions = new Lazy<IDictionary<string, SettingDefinition>>(CreateSettingDefinitions, true);
}
@ -53,21 +50,21 @@ namespace Volo.Abp.Settings
return SettingDefinitions.Value.GetOrDefault(name);
}
protected virtual List<ISettingDefinitionProvider> CreateSettingProviders()
{
return Options
.DefinitionProviders
.Select(p => _serviceProvider.GetRequiredService(p) as ISettingDefinitionProvider)
.ToList();
}
protected virtual IDictionary<string, SettingDefinition> CreateSettingDefinitions()
{
var settings = new Dictionary<string, SettingDefinition>();
foreach (var provider in Providers.Value)
using (var scope = ServiceProvider.CreateScope())
{
provider.Define(new SettingDefinitionContext(settings));
var providers = Options
.DefinitionProviders
.Select(p => scope.ServiceProvider.GetRequiredService(p) as ISettingDefinitionProvider)
.ToList();
foreach (var provider in providers)
{
provider.Define(new SettingDefinitionContext(settings));
}
}
return settings;

@ -2,7 +2,7 @@
namespace Volo.Abp.Settings
{
public abstract class SettingDefinitionProvider : ISettingDefinitionProvider, ISingletonDependency
public abstract class SettingDefinitionProvider : ISettingDefinitionProvider, ITransientDependency
{
public abstract void Define(ISettingDefinitionContext context);
}

@ -13,6 +13,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Settings\Volo.Abp.Settings.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />

@ -1,8 +1,10 @@
using Volo.Abp.Modularity;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace Volo.Abp.Settings
{
[DependsOn(
typeof(AbpAutofacModule),
typeof(AbpSettingsModule),
typeof(AbpTestBaseModule)
)]
@ -13,7 +15,6 @@ namespace Volo.Abp.Settings
Configure<SettingOptions>(options =>
{
options.ValueProviders.Add<TestSettingValueProvider>();
options.DefinitionProviders.Add<TestSettingDefinitionProvider>();
});
}
}

@ -13,6 +13,11 @@ namespace Volo.Abp.Settings
_settingProvider = GetRequiredService<ISettingProvider>();
}
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
}
[Fact]
public async Task Should_Get_Null_If_No_Value_Provided_And_No_Default_Value()
{

Loading…
Cancel
Save