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); } } }