AbpModuleCollection.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Abp.Collections.Extensions;
  5. namespace Abp.Modules
  6. {
  7. /// <summary>
  8. /// Used to store AbpModuleInfo objects as a dictionary.
  9. /// </summary>
  10. internal class AbpModuleCollection : List<AbpModuleInfo>
  11. {
  12. public Type StartupModuleType { get; }
  13. public AbpModuleCollection(Type startupModuleType)
  14. {
  15. StartupModuleType = startupModuleType;
  16. }
  17. /// <summary>
  18. /// Gets a reference to a module instance.
  19. /// </summary>
  20. /// <typeparam name="TModule">Module type</typeparam>
  21. /// <returns>Reference to the module instance</returns>
  22. public TModule GetModule<TModule>() where TModule : AbpModule
  23. {
  24. var module = this.FirstOrDefault(m => m.Type == typeof(TModule));
  25. if (module == null)
  26. {
  27. throw new AbpException("Can not find module for " + typeof(TModule).FullName);
  28. }
  29. return (TModule)module.Instance;
  30. }
  31. /// <summary>
  32. /// Sorts modules according to dependencies.
  33. /// If module A depends on module B, A comes after B in the returned List.
  34. /// </summary>
  35. /// <returns>Sorted list</returns>
  36. public List<AbpModuleInfo> GetSortedModuleListByDependency()
  37. {
  38. var sortedModules = this.SortByDependencies(x => x.Dependencies);
  39. EnsureKernelModuleToBeFirst(sortedModules);
  40. EnsureStartupModuleToBeLast(sortedModules, StartupModuleType);
  41. return sortedModules;
  42. }
  43. public static void EnsureKernelModuleToBeFirst(List<AbpModuleInfo> modules)
  44. {
  45. var kernelModuleIndex = modules.FindIndex(m => m.Type == typeof(AbpKernelModule));
  46. if (kernelModuleIndex <= 0)
  47. {
  48. //It's already the first!
  49. return;
  50. }
  51. var kernelModule = modules[kernelModuleIndex];
  52. modules.RemoveAt(kernelModuleIndex);
  53. modules.Insert(0, kernelModule);
  54. }
  55. public static void EnsureStartupModuleToBeLast(List<AbpModuleInfo> modules, Type startupModuleType)
  56. {
  57. var startupModuleIndex = modules.FindIndex(m => m.Type == startupModuleType);
  58. if (startupModuleIndex >= modules.Count - 1)
  59. {
  60. //It's already the last!
  61. return;
  62. }
  63. var startupModule = modules[startupModuleIndex];
  64. modules.RemoveAt(startupModuleIndex);
  65. modules.Add(startupModule);
  66. }
  67. public void EnsureKernelModuleToBeFirst()
  68. {
  69. EnsureKernelModuleToBeFirst(this);
  70. }
  71. public void EnsureStartupModuleToBeLast()
  72. {
  73. EnsureStartupModuleToBeLast(this, StartupModuleType);
  74. }
  75. }
  76. }