From dda709bcb4274647e254fffad06503d278da0306 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 11:03:37 +0300 Subject: [PATCH] Auto register setting definition providers. --- .../Volo/Abp/Emailing/AbpEmailingModule.cs | 5 ---- .../Abp/Localization/AbpLocalizationModule.cs | 5 ---- .../Volo/Abp/Settings/AbpSettingsModule.cs | 28 ++++++++++++++++++- .../Abp/Settings/SettingDefinitionManager.cs | 27 ++++++++---------- .../Abp/Settings/SettingDefinitionProvider.cs | 2 +- .../Volo.Abp.Settings.Tests.csproj | 1 + .../Abp/Settings/AbpSettingsTestModule.cs | 5 ++-- .../Abp/Settings/SettingProvider_Tests.cs | 5 ++++ 8 files changed, 49 insertions(+), 29 deletions(-) diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs index 7648ddc910..b861a3898c 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs @@ -18,11 +18,6 @@ namespace Volo.Abp.Emailing { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs index 3fcd90ac6d..a65e6863a8 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs @@ -27,11 +27,6 @@ namespace Volo.Abp.Localization .Add("en") .AddVirtualJson("/Localization/Resources/AbpValidation"); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs index d86f6ca524..1951ab61b5 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs +++ b/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.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(options => @@ -22,5 +30,23 @@ namespace Volo.Abp.Settings options.ValueProviders.Add(); }); } + + private static void AutoAddDefinitionProviders(IServiceCollection services) + { + var definitionProviders = new List(); + + services.OnRegistred(context => + { + if (typeof(ISettingDefinitionProvider).IsAssignableFrom(context.ImplementationType)) + { + definitionProviders.Add(context.ImplementationType); + } + }); + + services.Configure(options => + { + options.DefinitionProviders.AddIfNotContains(definitionProviders); + }); + } } } diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs index 7241d3654d..387ea77d05 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs @@ -10,22 +10,19 @@ namespace Volo.Abp.Settings { public class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency { - protected Lazy> Providers { get; } - protected Lazy> SettingDefinitions { get; } protected SettingOptions Options { get; } - private readonly IServiceProvider _serviceProvider; + protected IServiceProvider ServiceProvider { get; } public SettingDefinitionManager( IOptions options, IServiceProvider serviceProvider) { - _serviceProvider = serviceProvider; + ServiceProvider = serviceProvider; Options = options.Value; - Providers = new Lazy>(CreateSettingProviders, true); SettingDefinitions = new Lazy>(CreateSettingDefinitions, true); } @@ -53,21 +50,21 @@ namespace Volo.Abp.Settings return SettingDefinitions.Value.GetOrDefault(name); } - protected virtual List CreateSettingProviders() - { - return Options - .DefinitionProviders - .Select(p => _serviceProvider.GetRequiredService(p) as ISettingDefinitionProvider) - .ToList(); - } - protected virtual IDictionary CreateSettingDefinitions() { var settings = new Dictionary(); - 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; diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs index 04e6fc7eb2..8cd4b28003 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs @@ -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); } diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj index 47c93c6bf4..7f83c36c9a 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj +++ b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj @@ -13,6 +13,7 @@ + diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs index dc4ab057a0..09a50daa5d 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs +++ b/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 { [DependsOn( + typeof(AbpAutofacModule), typeof(AbpSettingsModule), typeof(AbpTestBaseModule) )] @@ -13,7 +15,6 @@ namespace Volo.Abp.Settings Configure(options => { options.ValueProviders.Add(); - options.DefinitionProviders.Add(); }); } } diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs index 6b95b0f755..c3c22f76f9 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs +++ b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs @@ -13,6 +13,11 @@ namespace Volo.Abp.Settings _settingProvider = GetRequiredService(); } + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + [Fact] public async Task Should_Get_Null_If_No_Value_Provided_And_No_Default_Value() {