Browse Source

Added SortByDependency for module loader.

pull/81/head
Halil İbrahim Kalkan 9 years ago
parent
commit
03b687912c
  1. 20
      src/Volo.Abp/Abp/Modularity/ModuleLoader.cs
  2. 18
      src/Volo.ExtensionMethods/ExtensionMethods/Collections/Generic/ListExtensions.cs
  3. 30
      test/Volo.Abp.Tests/Modularity/ModuleLoader_Tests.cs

20
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<Type> FindAllModuleTypes(Type startupModuleType)
{

18
src/Volo.ExtensionMethods/ExtensionMethods/Collections/Generic/ListExtensions.cs

@ -8,6 +8,24 @@ namespace Volo.ExtensionMethods.Collections.Generic
/// </summary>
public static class ListExtensions
{
public static void MoveItem<T>(this List<T> source, Predicate<T> 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);
}
/// <summary>
/// Sort a list by a topological sorting, which consider their dependencies
/// </summary>

30
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)
{
}
}
}
}
Loading…
Cancel
Save