using System;
using System.Collections.Generic;
using System.Linq;
using Abp.Collections.Extensions;
namespace Abp.Modules
{
///
/// Used to store AbpModuleInfo objects as a dictionary.
///
internal class AbpModuleCollection : List
{
public Type StartupModuleType { get; }
public AbpModuleCollection(Type startupModuleType)
{
StartupModuleType = startupModuleType;
}
///
/// Gets a reference to a module instance.
///
/// Module type
/// Reference to the module instance
public TModule GetModule() where TModule : AbpModule
{
var module = this.FirstOrDefault(m => m.Type == typeof(TModule));
if (module == null)
{
throw new AbpException("Can not find module for " + typeof(TModule).FullName);
}
return (TModule)module.Instance;
}
///
/// Sorts modules according to dependencies.
/// If module A depends on module B, A comes after B in the returned List.
///
/// Sorted list
public List GetSortedModuleListByDependency()
{
var sortedModules = this.SortByDependencies(x => x.Dependencies);
EnsureKernelModuleToBeFirst(sortedModules);
EnsureStartupModuleToBeLast(sortedModules, StartupModuleType);
return sortedModules;
}
public static void EnsureKernelModuleToBeFirst(List modules)
{
var kernelModuleIndex = modules.FindIndex(m => m.Type == typeof(AbpKernelModule));
if (kernelModuleIndex <= 0)
{
//It's already the first!
return;
}
var kernelModule = modules[kernelModuleIndex];
modules.RemoveAt(kernelModuleIndex);
modules.Insert(0, kernelModule);
}
public static void EnsureStartupModuleToBeLast(List modules, Type startupModuleType)
{
var startupModuleIndex = modules.FindIndex(m => m.Type == startupModuleType);
if (startupModuleIndex >= modules.Count - 1)
{
//It's already the last!
return;
}
var startupModule = modules[startupModuleIndex];
modules.RemoveAt(startupModuleIndex);
modules.Add(startupModule);
}
public void EnsureKernelModuleToBeFirst()
{
EnsureKernelModuleToBeFirst(this);
}
public void EnsureStartupModuleToBeLast()
{
EnsureStartupModuleToBeLast(this, StartupModuleType);
}
}
}