From 03b687912c15bc212322ff1bc45eb6e7b2938ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 4 Dec 2016 22:46:14 +0300 Subject: [PATCH] Added SortByDependency for module loader. --- src/Volo.Abp/Abp/Modularity/ModuleLoader.cs | 20 +++++++++---- .../Collections/Generic/ListExtensions.cs | 18 +++++++++++ .../Modularity/ModuleLoader_Tests.cs | 30 +++++++++++++++++++ 3 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 test/Volo.Abp.Tests/Modularity/ModuleLoader_Tests.cs diff --git a/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs b/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs index 942c700929..9a86277ee7 100644 --- a/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs +++ b/src/Volo.Abp/Abp/Modularity/ModuleLoader.cs @@ -27,24 +27,32 @@ namespace Volo.Abp.Modularity FillModules(startupModuleType); SetModuleDependencies(); + SortByDependency(startupModuleType); ConfigureServices(services); } - private void SetModuleDependencies() + private void FillModules(Type startupModuleType) { - foreach (var module in Modules) + foreach (var moduleType in FindAllModuleTypes(startupModuleType).Distinct()) { - SetModuleDependencies(module); + _modules.Add(CreateModuleDescriptor(moduleType)); } } - private void FillModules(Type startupModuleType) + private void SetModuleDependencies() { - foreach (var moduleType in FindAllModuleTypes(startupModuleType).Distinct()) + foreach (var module in Modules) { - _modules.Add(CreateModuleDescriptor(moduleType)); + SetModuleDependencies(module); } } + + private void SortByDependency(Type startupModuleType) + { + _modules.SortByDependencies(m => m.Dependencies); + _modules.MoveItem(m => m.Type == typeof(AbpKernelModule), 0); + _modules.MoveItem(m => m.Type == startupModuleType, _modules.Count - 1); + } protected virtual IEnumerable FindAllModuleTypes(Type startupModuleType) { diff --git a/src/Volo.ExtensionMethods/ExtensionMethods/Collections/Generic/ListExtensions.cs b/src/Volo.ExtensionMethods/ExtensionMethods/Collections/Generic/ListExtensions.cs index 47c0a49612..cf69ddb329 100644 --- a/src/Volo.ExtensionMethods/ExtensionMethods/Collections/Generic/ListExtensions.cs +++ b/src/Volo.ExtensionMethods/ExtensionMethods/Collections/Generic/ListExtensions.cs @@ -8,6 +8,24 @@ namespace Volo.ExtensionMethods.Collections.Generic /// public static class ListExtensions { + public static void MoveItem(this List source, Predicate selector, int targetIndex) + { + if (!targetIndex.IsBetween(0, source.Count - 1)) + { + throw new IndexOutOfRangeException("targetIndex should be between 0 and " + (source.Count - 1)); + } + + var currentIndex = source.FindIndex(0, selector); + if (currentIndex == targetIndex) + { + return; + } + + var item = source[currentIndex]; + source.RemoveAt(currentIndex); + source.Insert(targetIndex, item); + } + /// /// Sort a list by a topological sorting, which consider their dependencies /// diff --git a/test/Volo.Abp.Tests/Modularity/ModuleLoader_Tests.cs b/test/Volo.Abp.Tests/Modularity/ModuleLoader_Tests.cs new file mode 100644 index 0000000000..2a541a4450 --- /dev/null +++ b/test/Volo.Abp.Tests/Modularity/ModuleLoader_Tests.cs @@ -0,0 +1,30 @@ +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.Abp.Tests.Modularity +{ + public class ModuleLoader_Tests + { + [Fact] + public void Should_Load_Modules_By_Dependency_Order() + { + var moduleLoader = new ModuleLoader(); + moduleLoader.LoadAll(new ServiceCollection(), typeof(MyStartupModule)); + 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)); + } + + [DependsOn(typeof(IndependentEmptyModule))] + public class MyStartupModule : IAbpModule + { + public void ConfigureServices(IServiceCollection services) + { + + } + } + } +}