AbpModuleManager.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Immutable;
  4. using System.Linq;
  5. using Abp.Collections.Extensions;
  6. using Abp.Configuration.Startup;
  7. using Abp.Dependency;
  8. using Abp.PlugIns;
  9. using Castle.Core.Logging;
  10. namespace Abp.Modules
  11. {
  12. /// <summary>
  13. /// This class is used to manage modules.
  14. /// </summary>
  15. public class AbpModuleManager : IAbpModuleManager
  16. {
  17. public AbpModuleInfo StartupModule { get; private set; }
  18. public IReadOnlyList<AbpModuleInfo> Modules => _modules.ToImmutableList();
  19. public ILogger Logger { get; set; }
  20. private AbpModuleCollection _modules;
  21. private readonly IIocManager _iocManager;
  22. private readonly IAbpPlugInManager _abpPlugInManager;
  23. public AbpModuleManager(IIocManager iocManager, IAbpPlugInManager abpPlugInManager)
  24. {
  25. _iocManager = iocManager;
  26. _abpPlugInManager = abpPlugInManager;
  27. Logger = NullLogger.Instance;
  28. }
  29. public virtual void Initialize(Type startupModule)
  30. {
  31. _modules = new AbpModuleCollection(startupModule);
  32. LoadAllModules();
  33. }
  34. public virtual void StartModules()
  35. {
  36. var sortedModules = _modules.GetSortedModuleListByDependency();
  37. sortedModules.ForEach(module => module.Instance.PreInitialize());
  38. sortedModules.ForEach(module => module.Instance.Initialize());
  39. sortedModules.ForEach(module => module.Instance.PostInitialize());
  40. }
  41. public virtual void ShutdownModules()
  42. {
  43. Logger.Debug("Shutting down has been started");
  44. var sortedModules = _modules.GetSortedModuleListByDependency();
  45. sortedModules.Reverse();
  46. sortedModules.ForEach(sm => sm.Instance.Shutdown());
  47. Logger.Debug("Shutting down completed.");
  48. }
  49. private void LoadAllModules()
  50. {
  51. Logger.Debug("Loading Abp modules...");
  52. List<Type> plugInModuleTypes;
  53. var moduleTypes = FindAllModuleTypes(out plugInModuleTypes).Distinct().ToList();
  54. Logger.Debug("Found " + moduleTypes.Count + " ABP modules in total.");
  55. RegisterModules(moduleTypes);
  56. CreateModules(moduleTypes, plugInModuleTypes);
  57. _modules.EnsureKernelModuleToBeFirst();
  58. _modules.EnsureStartupModuleToBeLast();
  59. SetDependencies();
  60. Logger.DebugFormat("{0} modules loaded.", _modules.Count);
  61. }
  62. private List<Type> FindAllModuleTypes(out List<Type> plugInModuleTypes)
  63. {
  64. plugInModuleTypes = new List<Type>();
  65. var modules = AbpModule.FindDependedModuleTypesRecursivelyIncludingGivenModule(_modules.StartupModuleType);
  66. foreach (var plugInModuleType in _abpPlugInManager.PlugInSources.GetAllModules())
  67. {
  68. if (modules.AddIfNotContains(plugInModuleType))
  69. {
  70. plugInModuleTypes.Add(plugInModuleType);
  71. }
  72. }
  73. return modules;
  74. }
  75. private void CreateModules(ICollection<Type> moduleTypes, List<Type> plugInModuleTypes)
  76. {
  77. foreach (var moduleType in moduleTypes)
  78. {
  79. var moduleObject = _iocManager.Resolve(moduleType) as AbpModule;
  80. if (moduleObject == null)
  81. {
  82. throw new AbpInitializationException("This type is not an ABP module: " + moduleType.AssemblyQualifiedName);
  83. }
  84. moduleObject.IocManager = _iocManager;
  85. moduleObject.Configuration = _iocManager.Resolve<IAbpStartupConfiguration>();
  86. var moduleInfo = new AbpModuleInfo(moduleType, moduleObject, plugInModuleTypes.Contains(moduleType));
  87. _modules.Add(moduleInfo);
  88. if (moduleType == _modules.StartupModuleType)
  89. {
  90. StartupModule = moduleInfo;
  91. }
  92. Logger.DebugFormat("Loaded module: " + moduleType.AssemblyQualifiedName);
  93. }
  94. }
  95. private void RegisterModules(ICollection<Type> moduleTypes)
  96. {
  97. foreach (var moduleType in moduleTypes)
  98. {
  99. _iocManager.RegisterIfNot(moduleType);
  100. }
  101. }
  102. private void SetDependencies()
  103. {
  104. foreach (var moduleInfo in _modules)
  105. {
  106. moduleInfo.Dependencies.Clear();
  107. //Set dependencies for defined DependsOnAttribute attribute(s).
  108. foreach (var dependedModuleType in AbpModule.FindDependedModuleTypes(moduleInfo.Type))
  109. {
  110. var dependedModuleInfo = _modules.FirstOrDefault(m => m.Type == dependedModuleType);
  111. if (dependedModuleInfo == null)
  112. {
  113. throw new AbpInitializationException("Could not find a depended module " + dependedModuleType.AssemblyQualifiedName + " for " + moduleInfo.Type.AssemblyQualifiedName);
  114. }
  115. if ((moduleInfo.Dependencies.FirstOrDefault(dm => dm.Type == dependedModuleType) == null))
  116. {
  117. moduleInfo.Dependencies.Add(dependedModuleInfo);
  118. }
  119. }
  120. }
  121. }
  122. }
  123. }