From 0a6d557875782e97d40c9b51e4d8626c9cb5249e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 14 Dec 2016 22:55:21 +0300 Subject: [PATCH] Introduced module manager and revised module loader. --- src/Volo.Abp/Volo/Abp/AbpApplication.cs | 10 ++-- .../Volo/Abp/Modularity/IModuleLoader.cs | 5 +- .../Volo/Abp/Modularity/IModuleManager.cs | 9 ++++ .../Abp/Modularity/ModuleLifecycleManager.cs | 10 ++-- .../Volo/Abp/Modularity/ModuleLoader.cs | 50 ++++++++----------- .../Volo/Abp/Modularity/ModuleManager.cs | 20 ++++++++ .../Volo/Abp/Modularity/ModuleLoader_Tests.cs | 10 ++-- 7 files changed, 66 insertions(+), 48 deletions(-) create mode 100644 src/Volo.Abp/Volo/Abp/Modularity/IModuleManager.cs create mode 100644 src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs diff --git a/src/Volo.Abp/Volo/Abp/AbpApplication.cs b/src/Volo.Abp/Volo/Abp/AbpApplication.cs index 364caffae4..5eca86466a 100644 --- a/src/Volo.Abp/Volo/Abp/AbpApplication.cs +++ b/src/Volo.Abp/Volo/Abp/AbpApplication.cs @@ -12,6 +12,8 @@ namespace Volo.Abp public IServiceProvider ServiceProvider { get; private set; } + internal AbpModuleDescriptor[] Modules { get; } + private AbpApplication( [NotNull] Type startupModuleType, [NotNull] IServiceCollection services, @@ -26,7 +28,7 @@ namespace Volo.Abp optionsAction?.Invoke(options); services.AddCoreAbpServices(this); - LoadModules(services, options); + Modules = LoadModules(services, options); } internal static AbpApplication Create([NotNull] IServiceCollection services) @@ -66,11 +68,11 @@ namespace Volo.Abp ServiceProvider.GetRequiredService().InitializeModules(); } - private void LoadModules(IServiceCollection services, AbpApplicationCreationOptions options) + private AbpModuleDescriptor[] LoadModules(IServiceCollection services, AbpApplicationCreationOptions options) { - services + return services .GetSingletonInstance() - .LoadAll( + .LoadModules( services, StartupModuleType, options.PlugInSources diff --git a/src/Volo.Abp/Volo/Abp/Modularity/IModuleLoader.cs b/src/Volo.Abp/Volo/Abp/Modularity/IModuleLoader.cs index e7075942ea..65a1d44b0e 100644 --- a/src/Volo.Abp/Volo/Abp/Modularity/IModuleLoader.cs +++ b/src/Volo.Abp/Volo/Abp/Modularity/IModuleLoader.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity.PlugIns; @@ -7,8 +6,6 @@ namespace Volo.Abp.Modularity { public interface IModuleLoader { - IReadOnlyList Modules { get; } - - void LoadAll(IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources); + AbpModuleDescriptor[] LoadModules(IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources); } } diff --git a/src/Volo.Abp/Volo/Abp/Modularity/IModuleManager.cs b/src/Volo.Abp/Volo/Abp/Modularity/IModuleManager.cs new file mode 100644 index 0000000000..418b9bec40 --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Modularity/IModuleManager.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Modularity +{ + public interface IModuleManager + { + IReadOnlyList Modules { get; } + } +} diff --git a/src/Volo.Abp/Volo/Abp/Modularity/ModuleLifecycleManager.cs b/src/Volo.Abp/Volo/Abp/Modularity/ModuleLifecycleManager.cs index f0e6f0b2fd..21dd5f1682 100644 --- a/src/Volo.Abp/Volo/Abp/Modularity/ModuleLifecycleManager.cs +++ b/src/Volo.Abp/Volo/Abp/Modularity/ModuleLifecycleManager.cs @@ -5,12 +5,12 @@ namespace Volo.Abp.Modularity { public class ModuleLifecycleManager : IModuleLifecycleManager, ISingletonDependency { - private readonly IModuleLoader _moduleLoader; + private readonly IModuleManager _moduleManager; private readonly IEnumerable _contributers; - public ModuleLifecycleManager(IModuleLoader moduleLoader, IEnumerable contributers) + public ModuleLifecycleManager(IModuleManager moduleManager, IEnumerable contributers) { - _moduleLoader = moduleLoader; + _moduleManager = moduleManager; _contributers = contributers; } @@ -18,7 +18,7 @@ namespace Volo.Abp.Modularity { foreach (var contributer in _contributers) { - foreach (var module in _moduleLoader.Modules) + foreach (var module in _moduleManager.Modules) { contributer.Initialize(module.Instance); } @@ -29,7 +29,7 @@ namespace Volo.Abp.Modularity { foreach (var contributer in _contributers) { - foreach (var module in _moduleLoader.Modules) + foreach (var module in _moduleManager.Modules) { contributer.Shutdown(module.Instance); } diff --git a/src/Volo.Abp/Volo/Abp/Modularity/ModuleLoader.cs b/src/Volo.Abp/Volo/Abp/Modularity/ModuleLoader.cs index 698c957c65..6435328586 100644 --- a/src/Volo.Abp/Volo/Abp/Modularity/ModuleLoader.cs +++ b/src/Volo.Abp/Volo/Abp/Modularity/ModuleLoader.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Modularity.PlugIns; @@ -10,28 +9,19 @@ namespace Volo.Abp.Modularity { public class ModuleLoader : IModuleLoader { - public IReadOnlyList Modules => _modules.ToImmutableList(); - private readonly List _modules; - - public ModuleLoader() + public AbpModuleDescriptor[] LoadModules(IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources) { - _modules = new List(); - } + var modules = new List(); - public virtual void LoadAll(IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources) - { - if (_modules.Any()) - { - throw new InvalidOperationException($"{nameof(LoadAll)} should be called only once!"); - } + FillModules(modules, services, startupModuleType, plugInSources); + SetModuleDependencies(modules); + SortByDependency(modules, startupModuleType); + ConfigureServices(modules, services); - FillModules(services, startupModuleType, plugInSources); - SetModuleDependencies(); - SortByDependency(startupModuleType); - ConfigureServices(services); + return modules.ToArray(); } - private void FillModules(IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources) + protected virtual void FillModules(List modules, IServiceCollection services, Type startupModuleType, PlugInSourceList plugInSources) { //All modules starting from the startup module var moduleTypes = AbpModuleFinder.FindAllModuleTypes(startupModuleType); @@ -45,23 +35,23 @@ namespace Volo.Abp.Modularity //Create all modules foreach (var moduleType in moduleTypes) { - _modules.Add(CreateModuleDescriptor(services, moduleType)); + modules.Add(CreateModuleDescriptor(services, moduleType)); } } - private void SetModuleDependencies() + protected virtual void SetModuleDependencies(List modules) { - foreach (var module in Modules) + foreach (var module in modules) { - SetModuleDependencies(module); + SetModuleDependencies(modules, module); } } - private void SortByDependency(Type startupModuleType) + protected virtual void SortByDependency(List modules, Type startupModuleType) { - _modules.SortByDependencies(m => m.Dependencies); - _modules.MoveItem(m => m.Type == typeof(AbpKernelModule), 0); - _modules.MoveItem(m => m.Type == startupModuleType, _modules.Count - 1); + modules.SortByDependencies(m => m.Dependencies); + modules.MoveItem(m => m.Type == typeof(AbpKernelModule), 0); + modules.MoveItem(m => m.Type == startupModuleType, modules.Count - 1); } protected virtual AbpModuleDescriptor CreateModuleDescriptor(IServiceCollection services, Type moduleType) @@ -76,19 +66,19 @@ namespace Volo.Abp.Modularity return module; } - protected virtual void ConfigureServices(IServiceCollection services) + protected virtual void ConfigureServices(List modules, IServiceCollection services) { - foreach (var module in _modules) + foreach (var module in modules) { module.Instance.ConfigureServices(services); } } - protected virtual void SetModuleDependencies(AbpModuleDescriptor module) + protected virtual void SetModuleDependencies(List modules, AbpModuleDescriptor module) { foreach (var dependedModuleType in AbpModuleFinder.FindDependedModuleTypes(module.Type)) { - var dependedModule = _modules.FirstOrDefault(m => m.Type == dependedModuleType); + var dependedModule = modules.FirstOrDefault(m => m.Type == dependedModuleType); if (dependedModule == null) { throw new AbpException("Could not find a depended module " + dependedModuleType.AssemblyQualifiedName + " for " + module.Type.AssemblyQualifiedName); diff --git a/src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs b/src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs new file mode 100644 index 0000000000..ae8ec1c0ce --- /dev/null +++ b/src/Volo.Abp/Volo/Abp/Modularity/ModuleManager.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using Volo.DependencyInjection; + +namespace Volo.Abp.Modularity +{ + public class ModuleManager : IModuleManager, ISingletonDependency + { + public IReadOnlyList Modules => _modules.ToImmutableList(); + + private readonly List _modules; + + public ModuleManager(AbpApplication application) + { + _modules = application.Modules.ToList(); + } + + } +} \ No newline at end of file diff --git a/test/Volo.Abp.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs b/test/Volo.Abp.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs index dfa6a34ec4..74e45d91b0 100644 --- a/test/Volo.Abp.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs +++ b/test/Volo.Abp.Tests/Volo/Abp/Modularity/ModuleLoader_Tests.cs @@ -11,11 +11,11 @@ namespace Volo.Abp.Modularity public void Should_Load_Modules_By_Dependency_Order() { var moduleLoader = new ModuleLoader(); - moduleLoader.LoadAll(new ServiceCollection(), typeof(MyStartupModule), new PlugInSourceList()); - moduleLoader.Modules.Count.ShouldBe(3); - moduleLoader.Modules[0].Type.ShouldBe(typeof(AbpKernelModule)); - moduleLoader.Modules[1].Type.ShouldBe(typeof(IndependentEmptyModule)); - moduleLoader.Modules[2].Type.ShouldBe(typeof(MyStartupModule)); + var modules = moduleLoader.LoadModules(new ServiceCollection(), typeof(MyStartupModule), new PlugInSourceList()); + modules.Length.ShouldBe(3); + modules[0].Type.ShouldBe(typeof(AbpKernelModule)); + modules[1].Type.ShouldBe(typeof(IndependentEmptyModule)); + modules[2].Type.ShouldBe(typeof(MyStartupModule)); } [DependsOn(typeof(IndependentEmptyModule))]