abp运行流程

由于公司现在大量向abp框架+react前后端分离架构转型,所以有必要分析abp框架是如何在iis运行的,所以才有这篇文章

public class MvcApplication : AbpWebApplication<MyAbpApplicationWebModule>
{
protected override void Application_Start(object sender, EventArgs e)
{
AbpBootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(
f => f.UseAbpLog4Net().WithConfig(Server.MapPath("log4net.config"))
); base.Application_Start(sender, e);
}
}`

当web应用程序启动,AbpWebApplication<TStartupModule>AbpBootstrapper构造函数注册Module,并检查这个Module是否集成自AbpModule,初始化IocManager,PlugInSources以及日志实例。还注册了拦截器

    private void AddInterceptorRegistrars()
{
ValidationInterceptorRegistrar.Initialize(IocManager);
AuditingInterceptorRegistrar.Initialize(IocManager);
UnitOfWorkRegistrar.Initialize(IocManager);
AuthorizationInterceptorRegistrar.Initialize(IocManager);
}`

AbpWebApplication.Application_Start初始化abp系统

    protected virtual void Application_Start(object sender, EventArgs e)
{
ThreadCultureSanitizer.Sanitize();
AbpBootstrapper.Initialize(); //这里就是初始化abp系统,后面又详细讲到
}

我们注意到AbpWebApplication<TStartupModule>中的TStartupModule有个约束:TStartupModule:AbpModule让我们来看下这个类的大体定义:

A module definition class is generally located in it's own assembly and implements some action in module events on application startup and shutdown.It also defines depended modules.

意思是在自己的模块程序集中定义实现了一些在应用程序启动到结束期间的事件操作,也定义依赖的那些模块。在源代码中能看到作者定义了四个事件操作:

  • PreInitialize: 应用程序开始时触发,在依赖注入注册之前,代码能放在这里运;
  • Initialize: 主要用来依赖注入;
  • PostInitialize: 应用程序启动之后触发;
  • Shutdown: 应用程序结束时触发

除了这四个周期事件,还有一种重要的操作就是递归查找所有依赖模块类,返回所有的模块类

public static List<Type> FindDependedModuleTypes(Type moduleType)

这里我就有一个疑问了,定义了这四个周期事件,那么是在哪里调用的呢?

带着问题查找源代码,发现在AbpBootstrapper.Initialize方法中注册了模块管理类:AbpModuleManager

/// <summary>
/// Initializes the ABP system.
/// </summary>
public virtual void Initialize()
{
ResolveLogger();
try
{
RegisterBootstrapper();
IocManager.IocContainer.Install(new AbpCoreInstaller());
IocManager.Resolve<AbpPlugInManager>().PlugInSources.AddRange(PlugInSources);
IocManager.Resolve<AbpStartupConfiguration>().Initialize(); _moduleManager = IocManager.Resolve<AbpModuleManager>();
_moduleManager.Initialize(StartupModule);//这里初始话模块集合以及加载所有模块类
_moduleManager.StartModules();//这里就调用了模块定义的周期事件操作
}
...
}

继续追踪AbpModuleManager.Initialize(Type startupModule);_moduleManager.StartModules();

在应用程序结束时(在abp系统中体现在AbpBootstrapper.Dispose)

public virtual void Initialize(Type startupModule)
{
_modules = new AbpModuleCollection(startupModule);//初始化模块集合list
LoadAllModules();//加载所有模块类
}
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());
}
/// <summary>
/// Disposes the ABP system.
/// </summary>
public virtual void Dispose()
{
if (IsDisposed)
{
return;
}
IsDisposed = true;
_moduleManager?.ShutdownModules();//调用module.Instance.Shutdown
}

至此,我们就很清楚的知道了abp是在那个时期如何进行依赖注入的,是什么时候注册插件以及自定义的四个“钩子事件”

abp运行机制分析的更多相关文章

  1. kubernetes之kube-proxy运行机制分析

    在kubernetes集群的每个node都会运行一个kube-proxy服务进程,这个进程可用看作Service的透明代理兼负载均衡器.其核心功能是将到某个Service的访问请求转发到后端的多个po ...

  2. kubernetes之kubelet运行机制分析

    kubernetes集群中,每个Node节点工作节点上都会启动一个kubelet服务进程.用于处理master节点下发到本节点的任务,管理pod和pod中的容器.每个kubelet进程都会在API S ...

  3. kube-proxy运行机制分析【转载】

    转自:http://blog.itpub.net/28624388/viewspace-2155433/ 1.Service在很多情况下只是一个概念,而真正将Service的作用实现的是kube-pr ...

  4. ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析

    理解ActiveRecord::Concern: 参考:include和extend的区别: https://www.cnblogs.com/chentianwei/p/9408963.html 传统 ...

  5. ASP.NET MVC的运行机制--url的全局分析

    全局 首先我们来看一副图片       首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...

  6. .net core系列之《从源码对Configuration的底层运行机制进行分析》

    通过对Configuration源代码的分析从而来自定义一个配置数据源 1.用反编译工具来看看AddJsonFile()这个方法究竟干了什么,源代码如下: public static IConfigu ...

  7. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  8. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

  9. ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...

随机推荐

  1. html5 Ajax 访问.net WebApi获取视频流

    http://localhost//api/Test/GetVideo?filename=/GoodVideo/e36a144b-52cd-4174-93d2-cfc41aea6c1d.mp4 是AP ...

  2. 二、winForm-DataGridView操作——DataGridView 操作、属性说明

    注册:Form加载窗体代码 /// <summary> /// 窗体加载Form1 /// </summary> /// <param name="sender ...

  3. C# 根据偶数、奇数加载不同颜色

    效果图: C#后台代码 //偶数随机 Random evenRanm = new Random(); //奇数随机 Random oddRanm = new Random(); string[] li ...

  4. ubuntu16搭建harbor镜像库

    参考 https://blog.csdn.net/qq_35720307/article/details/86691752 目的:搭建本地镜像库,方便快速的存放和拉取需要的镜像文件.

  5. ajax post 请求发送 json 字符串

    $.ajax({ // 请求方式 type:"post", // contentType contentType:"application/json", // ...

  6. Sublime Text3 实现在浏览器中以HTML格式预览md文件

    1.首先找到Package Control 打开Sublime Text3,找到菜单栏:Preferences → Package Control,没有找到Package Control,那么点击Pa ...

  7. 基于iview的后台管理

    年前由于时间紧迫,原本使用iview技术开发后台管理系统的大神另有任务,我中途接手该项目,此前对于iview一无所知的我是一脸的懵逼,好在后台管理的整体框架大神已经搭建好了,而我之前对vue也有一定的 ...

  8. Golang 中哪些值是不可以寻址的

    不可以寻址, 指的是不能通过&获得其地址. golang中不能寻址的可以总结为:不可变的,临时结果和不安全的.只要符合其中任何一个条件,它就是不可以寻址的. 具体为: 常量的值. 基本类型值的 ...

  9. Flask常用的钩子函数

    before_first_request:处理第一次请求之前执行.例如以下代码: @app.before_first_request def first_request(): print 'first ...

  10. Scala的Trait详解

    http://article.yeeyan.org/view/178378/358355