abp运行机制分析
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运行机制分析的更多相关文章
- kubernetes之kube-proxy运行机制分析
在kubernetes集群的每个node都会运行一个kube-proxy服务进程,这个进程可用看作Service的透明代理兼负载均衡器.其核心功能是将到某个Service的访问请求转发到后端的多个po ...
- kubernetes之kubelet运行机制分析
kubernetes集群中,每个Node节点工作节点上都会启动一个kubelet服务进程.用于处理master节点下发到本节点的任务,管理pod和pod中的容器.每个kubelet进程都会在API S ...
- kube-proxy运行机制分析【转载】
转自:http://blog.itpub.net/28624388/viewspace-2155433/ 1.Service在很多情况下只是一个概念,而真正将Service的作用实现的是kube-pr ...
- ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析
理解ActiveRecord::Concern: 参考:include和extend的区别: https://www.cnblogs.com/chentianwei/p/9408963.html 传统 ...
- ASP.NET MVC的运行机制--url的全局分析
全局 首先我们来看一副图片 首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...
- .net core系列之《从源码对Configuration的底层运行机制进行分析》
通过对Configuration源代码的分析从而来自定义一个配置数据源 1.用反编译工具来看看AddJsonFile()这个方法究竟干了什么,源代码如下: public static IConfigu ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- ABP源码分析三:ABP Module
Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...
- ABP源码分析四:Configuration
核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...
随机推荐
- Azure DevOps Server:Git权限设置
Azure DevOps Server 权限概述 在Azure DevOps Server (之前名称为TFS)中,权限是一个比较复杂的概念.从权限层级上来说,包括服务器级别.团队项目集合级别.团队项 ...
- 迁移桌面程序到MS Store(4)——桌面程序调用Win10 API
上一篇我们讨论了如何在转制的桌面程序中,通过StartupTask来实现转制版本的开机自启动.实际操作中,我们通过编辑Packaging工程中的Package.appxmanifest文件,来添加自启 ...
- UWP Background过渡动画
首先说两件事: 1.大爆炸我还记着呢,先欠着吧... 2.博客搬家啦,新地址:https://blog.ultrabluefire.cn/ ==========下面是正文========== 前些日子 ...
- Java计数器之CountDownLatch、CyclicBarrier、Semaphore
在Java里面有几种可以用于控制线程状态的方法,如CountDownLatch计数器.CyclicBarrier循环栅栏.Sempahore信号量.下面就分别演示下他们的使用方法: CountDown ...
- [Spring]IOC控制反转和DI依赖注入
从之前算起到现在接触Spring也已经有几天了,进度也不是很快,就只弄懂了控制反转和依赖注入那么一点东西.然后敲了两个demo 主要是因为之前没有学过,然后网上资源很多但是都不是面向我们初学者的,大多 ...
- odoo开发笔记:抛出警告的方式
上边rase 加3种写法,都能实现,跑出警告的功能.
- 使用 Redis 共享 Session 会话
储存模式 1.InProc模式 这是ASP.NET默认的Session管理模式,在应用进程内维护Session. 2.StateServer模式 这是在服务器装了.NET环境后自带的一个StateSe ...
- Linux-(watch,at,crontab)
watch命令 1.命令格式: watch [参数] [命令] 2.命令功能: 可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令. watch可以帮你监测一个命令的运行结 ...
- PHP 使用 GeoIP 进行不同国家 ip 测试
$ip = "67.220.91.30";// USA switch (mt_rand(0, 15)) { case 0:// India $ip = "210.212. ...
- 即时通讯App怎样才能火?背后的技术原理,可以从这5个角度切入
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 社交场景 ...