Browse Source

Added SortByDependency for module loader.

pull/81/head
Halil İbrahim Kalkan 10 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); FillModules(startupModuleType);
SetModuleDependencies(); SetModuleDependencies();
SortByDependency(startupModuleType);
ConfigureServices(services); 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) 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> /// </summary>
public static class ListExtensions 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> /// <summary>
/// Sort a list by a topological sorting, which consider their dependencies /// Sort a list by a topological sorting, which consider their dependencies
/// </summary> /// </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