Browse Source

Auto register setting definition providers.

pull/859/head
Halil ibrahim Kalkan 8 years ago
parent
commit
dda709bcb4
  1. 5
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs
  2. 5
      framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs
  3. 28
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs
  4. 27
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs
  5. 2
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs
  6. 1
      framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj
  7. 5
      framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs
  8. 5
      framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs

5
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs

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

5
framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs

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

28
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs

@ -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.Modularity;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.Security; using Volo.Abp.Security;
@ -12,6 +15,11 @@ namespace Volo.Abp.Settings
)] )]
public class AbpSettingsModule : AbpModule public class AbpSettingsModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context)
{
AutoAddDefinitionProviders(context.Services);
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
Configure<SettingOptions>(options => Configure<SettingOptions>(options =>
@ -22,5 +30,23 @@ namespace Volo.Abp.Settings
options.ValueProviders.Add<UserSettingValueProvider>(); 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);
});
}
} }
} }

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

@ -10,22 +10,19 @@ namespace Volo.Abp.Settings
{ {
public class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency public class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency
{ {
protected Lazy<List<ISettingDefinitionProvider>> Providers { get; }
protected Lazy<IDictionary<string, SettingDefinition>> SettingDefinitions { get; } protected Lazy<IDictionary<string, SettingDefinition>> SettingDefinitions { get; }
protected SettingOptions Options { get; } protected SettingOptions Options { get; }
private readonly IServiceProvider _serviceProvider; protected IServiceProvider ServiceProvider { get; }
public SettingDefinitionManager( public SettingDefinitionManager(
IOptions<SettingOptions> options, IOptions<SettingOptions> options,
IServiceProvider serviceProvider) IServiceProvider serviceProvider)
{ {
_serviceProvider = serviceProvider; ServiceProvider = serviceProvider;
Options = options.Value; Options = options.Value;
Providers = new Lazy<List<ISettingDefinitionProvider>>(CreateSettingProviders, true);
SettingDefinitions = new Lazy<IDictionary<string, SettingDefinition>>(CreateSettingDefinitions, true); SettingDefinitions = new Lazy<IDictionary<string, SettingDefinition>>(CreateSettingDefinitions, true);
} }
@ -53,21 +50,21 @@ namespace Volo.Abp.Settings
return SettingDefinitions.Value.GetOrDefault(name); 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() protected virtual IDictionary<string, SettingDefinition> CreateSettingDefinitions()
{ {
var settings = new Dictionary<string, SettingDefinition>(); 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; return settings;

2
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs

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

1
framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj

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

5
framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs

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

5
framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs

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

Loading…
Cancel
Save