随笔 - 54, 文章 - 0, 评论 - 14, 阅读 - 21万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

ABP 框架从源码学习——abp框架启动和结束(1)

Posted on   徐自勉  阅读(2278)  评论(2编辑  收藏  举报

   1.abp框架的启动是从Global.asax文件的Application_Start启动的,当然代表Global的application必须从AbpWebApplication继承:

复制代码
1  public class MvcApplication : AbpWebApplication
2     {
3         protected override void Application_Start(object sender, EventArgs e)
4         {
5             AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithConfig("log4net.config"));
6             base.Application_Start(sender, e);
7         }
8     }
View Code
复制代码

   2.Application_Start方法中主要是通过AbpBootstrapper来将各个Abpmodule模块载入Abp框架中的AbpBootstrapper类在Abp.dll中, 其主要用于框架的基本配置的注册和初始化,AbpBootstrapper调用Initialize方法初始化

复制代码
    public abstract class AbpWebApplication : HttpApplication
    {/// <summary>
        /// This method is called by ASP.NET system on web application's startup.
        /// </summary>
        protected virtual void Application_Start(object sender, EventArgs e)
        {
            ThreadCultureSanitizer.Sanitize();

            AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>();
            AbpBootstrapper.Initialize();
        }
View Code
复制代码

而在 AbpBootstrapper.Initialize()方法在执行AbpBootstrapper的Initialize()方法时首先会执行AbpCoreInstaller的Initialize()

复制代码
    public virtual void Initialize()
        {
            IocManager.IocContainer.Install(new AbpCoreInstaller());

            IocManager.Resolve<AbpStartupConfiguration>().Initialize();

            _moduleManager = IocManager.Resolve<IAbpModuleManager>();
            _moduleManager.InitializeModules();
        }
View Code
复制代码

 AbpCoreInstaller的Initialize() 主要执行的就是注册系统框架级的所有配置类,具体代码如下

复制代码
 1  internal class AbpCoreInstaller : IWindsorInstaller
 2     {
 3         public void Install(IWindsorContainer container, IConfigurationStore store)
 4         {
 5             container.Register(
 6                 Component.For<IUnitOfWorkDefaultOptions, UnitOfWorkDefaultOptions>().ImplementedBy<UnitOfWorkDefaultOptions>().LifestyleSingleton(),
 7                 Component.For<INavigationConfiguration, NavigationConfiguration>().ImplementedBy<NavigationConfiguration>().LifestyleSingleton(),
 8                 Component.For<ILocalizationConfiguration, LocalizationConfiguration>().ImplementedBy<LocalizationConfiguration>().LifestyleSingleton(),
 9                 Component.For<IAuthorizationConfiguration, AuthorizationConfiguration>().ImplementedBy<AuthorizationConfiguration>().LifestyleSingleton(),
10                  //此处省略若干行
11 
12                 );
13         }
14     }
View Code
复制代码

 3.接着解析AbpStartupConfiguration的实例调用其Initialize()来完成所有配置项的初始设值。 

 4.最后,IAbpModuleManager的实例调用其InitializeModules()初始化所有的Module

复制代码
 1  public virtual void InitializeModules()
 2         {
 3             LoadAll();
 4 
 5             var sortedModules = _modules.GetSortedModuleListByDependency();
 6 
 7             sortedModules.ForEach(module => module.Instance.PreInitialize());
 8             sortedModules.ForEach(module => module.Instance.Initialize());
 9             sortedModules.ForEach(module => module.Instance.PostInitialize());
10         }
View Code
复制代码

主意:从上面的代码可以看出,ABP框架初始化每个module时,是先完成所有Module的PreInitialize,然后再执行所有Module的Initialize,最后执行PostInitialize。不是执行完一个Module的这三个方法,再去执行下一个Module的这三个方法。

另外,AbpModule的基本信息是用AbpModuleInfo封装的,他里面其实也就是将一个abpmodule类封装成Type,Assembly以及模块的依赖模块的AbpModuleInfo等信息。

5.一旦应用程序结束将在AbpWebApplications中调用AbpBootstrapper的Dispose方法,Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。

复制代码
1  protected virtual void Application_End(object sender, EventArgs e)
2         {
3             AbpBootstrapper.Dispose();
4         }
View Code
复制代码
复制代码
 public virtual void ShutdownModules()
        {
            var sortedModules = _modules.GetSortedModuleListByDependency();
            sortedModules.Reverse();
            sortedModules.ForEach(sm => sm.Instance.Shutdown());
        }
View Code
复制代码

 

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示