namespace Abp.Modules { public abstract class AbpModule { //获取对IOC管理器的引用 protected internal IIocManager IocManager { get; internal set; } // 获取对ABP配置项的引用 protected internal IAbpStartupConfiguration Configuration { get; internal set; } // 获取或设置日志 public ILogger Logger { get; set; } protected AbpModule() { Logger = NullLogger.Instance; } // 预初始化 public virtual void PreInitialize() { } // 初始化 public virtual void Initialize() { } //初始化后 public virtual void PostInitialize() { } // 关闭 public virtual void Shutdown() { } public virtual Assembly[] GetAdditionalAssemblies() { return new Assembly[0]; } // 检查是否为模块 public static bool IsAbpModule(Type type) { var typeInfo = type.GetTypeInfo(); return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsGenericType && typeof(AbpModule).IsAssignableFrom(type); } // 查找依赖模块 public static List<Type> FindDependedModuleTypes(Type moduleType) { if (!IsAbpModule(moduleType)) { throw new AbpInitializationException("This type is not an ABP module: " + moduleType.AssemblyQualifiedName); } var list = new List<Type>(); if (moduleType.GetTypeInfo().IsDefined(typeof(DependsOnAttribute), true)) { var dependsOnAttributes = moduleType.GetTypeInfo().GetCustomAttributes(typeof(DependsOnAttribute), true).Cast<DependsOnAttribute>(); foreach (var dependsOnAttribute in dependsOnAttributes) { foreach (var dependedModuleType in dependsOnAttribute.DependedModuleTypes) { list.Add(dependedModuleType); } } } return list; } //根据给定的模块递归查找其所依赖的模块 public static List<Type> FindDependedModuleTypesRecursivelyIncludingGivenModule(Type moduleType) { var list = new List<Type>(); AddModuleAndDependenciesRecursively(list, moduleType); list.AddIfNotContains(typeof(AbpKernelModule)); return list; } //递归添加模块和依赖 private static void AddModuleAndDependenciesRecursively(List<Type> modules, Type module) { if (!IsAbpModule(module)) { throw new AbpInitializationException("This type is not an ABP module: " + module.AssemblyQualifiedName); } if (modules.Contains(module)) { return; } modules.Add(module); var dependedModules = FindDependedModuleTypes(module); foreach (var dependedModule in dependedModules) { AddModuleAndDependenciesRecursively(modules, dependedModule); } } } }
在AbpModule可以看到模块的四个生命周期事件:
生命周期事件 |
说明 |
PreInitialize |
预初始化:在初始化之前配置框架和其他模块。能够在依赖注入注册之前,在这个方法中指定需要注入的自定义启动类 |
Initialize |
初始化:一般是来进行依赖注入的注册,常通过 IocManager.RegisterAssemblyByConvention 来实现 |
PostInitialize |
初始化后:用来解析依赖关系 |
Shutdown |
关闭:当应用关闭以后被调用 |
namespace Abp.Modules { [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class DependsOnAttribute : Attribute { public Type[] DependedModuleTypes { get; private set; } public DependsOnAttribute(params Type[] dependedModuleTypes) { DependedModuleTypes = dependedModuleTypes; } } }
//Web项目--呈现与分布式服务层 [DependsOn( typeof(AbpDemoApplicationModule), typeof(AbpDemoEntityFrameworkCoreModule), typeof(AbpAspNetCoreModule))] public class AbpDemoWebModule : AbpModule { //to do } //EntityFrameworkCore项目--基础设施层 [DependsOn( typeof(AbpDemoCoreModule), typeof(AbpEntityFrameworkCoreModule))] public class AbpDemoEntityFrameworkCoreModule : AbpModule { // to do } //Application项目--应用层 [DependsOn( typeof(AbpDemoCoreModule), typeof(AbpAutoMapperModule))] public class AbpDemoApplicationModule : AbpModule { // to do } //Core项目--领域层 public class AbpDemoCoreModule : AbpModule { // to do }
_moduleManager = IocManager.Resolve<AbpModuleManager>(); _moduleManager.Initialize(StartupModule); _moduleManager.StartModules();
public virtual void Initialize(Type startupModule) { _modules = new AbpModuleCollection(startupModule); LoadAllModules(); } private void LoadAllModules() { Logger.Debug("Loading Abp modules..."); List<Type> plugInModuleTypes; var moduleTypes = FindAllModuleTypes(out plugInModuleTypes).Distinct().ToList(); Logger.Debug("Found " + moduleTypes.Count + " ABP modules in total."); RegisterModules(moduleTypes); CreateModules(moduleTypes, plugInModuleTypes); _modules.EnsureKernelModuleToBeFirst(); _modules.EnsureStartupModuleToBeLast(); SetDependencies(); Logger.DebugFormat("{0} modules loaded.", _modules.Count); }
public virtual void StartModules() { var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.ForEach(module => module.Instance.PreInitialize()); sortedModules.ForEach(module => module.Instance.Initialize()); sortedModules.ForEach(module => module.Instance.PostInitialize()); }
public sealed class AbpKernelModule : AbpModule { public override void PreInitialize() { //注册过滤器与基础组件 IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar()); IocManager.Register<IScopedIocResolver, ScopedIocResolver>(DependencyLifeStyle.Transient); IocManager.Register(typeof(IAmbientScopeProvider<>), typeof(DataContextAmbientScopeProvider<>), DependencyLifeStyle.Transient); AddAuditingSelectors(); AddLocalizationSources(); AddSettingProviders(); AddUnitOfWorkFilters(); ConfigureCaches(); AddIgnoredTypes(); AddMethodParameterValidators(); AddDefaultNotificationDistributor(); } public override void Initialize() { // foreach (var replaceAction in ((AbpStartupConfiguration)Configuration).ServiceReplaceActions.Values) { replaceAction(); } IocManager.IocContainer.Install(new EventBusInstaller(IocManager)); IocManager.Register(typeof(IOnlineClientManager<>), typeof(OnlineClientManager<>), DependencyLifeStyle.Singleton); IocManager.Register(typeof(IOnlineClientStore<>), typeof(InMemoryOnlineClientStore<>), DependencyLifeStyle.Singleton); IocManager.Register(typeof(EventTriggerAsyncBackgroundJob<>), DependencyLifeStyle.Transient); IocManager.RegisterAssemblyByConvention(typeof(AbpKernelModule).GetAssembly(), new ConventionalRegistrationConfig { InstallInstallers = false }); } public override void PostInitialize() { RegisterMissingComponents(); IocManager.Resolve<SettingDefinitionManager>().Initialize(); IocManager.Resolve<FeatureManager>().Initialize(); IocManager.Resolve<PermissionManager>().Initialize(); IocManager.Resolve<LocalizationManager>().Initialize(); IocManager.Resolve<NotificationDefinitionManager>().Initialize(); IocManager.Resolve<NavigationManager>().Initialize(); if (Configuration.BackgroundJobs.IsJobExecutionEnabled) { var workerManager = IocManager.Resolve<IBackgroundWorkerManager>(); workerManager.Start(); workerManager.Add(IocManager.Resolve<IBackgroundJobManager>()); } } }