ABP架构学习系列二:ABP中配置的注册和初始化
一、手工搭建平台
1.创建项目
Install-Package Newtonsoft.Json -Version 8.0.
Install-Package Castle.Windsor -Version 3.3.
2.创建WebModule类
namespace ZmBlog.Web.App_Start
{
[DependsOn(typeof(AbpWebMvcModule))]
public class ZmBlogWebModule:AbpModule
{
public override void PreInitialize()
{
//依赖注入注册之前,主要用于初始化默认的配置
//开启本地化语言、配置等Hangfire
//关闭多租户、审计日志、AntiForgery等
} public override void Initialize()
{
//该方法通常是依赖注入注册的地方
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); AreaRegistration.RegisterAllAreas();
//FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
} public override void PostInitialize()
{
//依赖注入注册之后调用,在这里可以安全地解析一个依赖
} public override void Shutdown()
{
//在应用关闭的时候调用
}
}
}
3.配置Global.asax
public class MvcApplication : AbpWebApplication
{
protected override void Application_Start(object sender, EventArgs e)
{
base.Application_Start(sender, e);
}
}
4.修改默认控制器
二、初始化过程
public abstract class AbpWebApplication : HttpApplication
{
protected virtual void Application_Start(object sender, EventArgs e)
{
ThreadCultureSanitizer.Sanitize(); //设置当前线程的区域性
AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>();//加载bin目录下的所有dll并注册
AbpBootstrapper.Initialize();
}
}
3.关于AbpBootstrapper的Initialize()方法
public virtual void Initialize()
{
IocManager.IocContainer.Install(new AbpCoreInstaller());//注册系统框架级的所有配置类
IocManager.Resolve<AbpStartupConfiguration>().Initialize();//实例化配置类
_moduleManager = IocManager.Resolve<IAbpModuleManager>();
_moduleManager.InitializeModules();
}
4. IAbpModuleManager的实例调用其InitializeModules()初始化所有的Module
public virtual void InitializeModules()
{
LoadAll();
var sortedModules = _modules.GetSortedModuleListByDependency();
sortedModules.ForEach(module => module.Instance.PreInitialize());//先完成所有Module的PreInitialize
sortedModules.ForEach(module => module.Instance.Initialize());//再执行所有Module的Initialize
sortedModules.ForEach(module => module.Instance.PostInitialize());//最后执行PostInitialize
}
另外,AbpModule的基本信息是用AbpModuleInfo封装的,将一个abpmodule类封装成Type,Assembly以及模块的依赖模块的AbpModuleInfo等信息。
public virtual void ShutdownModules()
{
var sortedModules = _modules.GetSortedModuleListByDependency();
sortedModules.Reverse();
sortedModules.ForEach(sm => sm.Instance.Shutdown());
}
三、AbpBootstrapper
namespace Abp.Dependency
{
/// 此接口用于直接执行依赖项注入任务
public interface IIocManager : IIocRegistrar, IIocResolver, IDisposable
{
IWindsorContainer IocContainer { get; } /// 引用 Castle Windsor Container.
new bool IsRegistered(Type type); /// 检测该类型是否已注册.
new bool IsRegistered<T>(); /// 检测该类型是否已注册.
}
}
其中关系类图如下:

四、 AbpCoreInstaller

BasicConventionalRegistrar的代码,其注册所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类。

ABP架构学习系列二:ABP中配置的注册和初始化的更多相关文章
- ABP架构学习系列一 整体项目结构及目录
本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zha ...
- ABP架构学习系列
ABP实践学习系列 ABP Zero 本地化语言的初始化和扩展 ABP Zero 导航菜单之角色权限 ABP Zero示例项目问题总结 ABP后台服务之作业调度Quartz.NET ABP架构学 ...
- ABP架构学习系列三:手工搭建ABP框架
由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢 ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP架构学习系列四:集成Dapper
之前,一直想集成Dapper到项目中,但是一直没成功,今天把abp升级到最新版,然后按教程来,就可以了,呵呵 现在,基于上一篇的源码进行升级和集成dapper,将abp升级到3.8.2 官方 ...
- 源码学习系列之SpringBoot自动配置(篇二)
源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
随机推荐
- 基于maven的ssm框架整合
基于maven的ssm框架整合 第一步:通过maven建立一个web项目. 第二步:pom文件导入jar包 (1 ...
- java基础部分的简单应用
牛刀小试,MMP:嘿嘿,如有转载,请声明地址http://www.cnblogs.com/jinmoon/: 图形类,点类,三角形类,汽车类,接口:运用继承,抽象类,接口,多态:已知点类三点,输出三点 ...
- python3.6 urllib.request库实现简单的网络爬虫、下载图片
#更新日志:#0418 爬取页面商品URL#0421 更新 添加爬取下载页面图片功能#0423 更新 添加发送邮件功能# 优化 爬虫异常处理.错误页面及空页面处理# 优化 爬虫关键字黑名单.白名单,提 ...
- sed命令针对文件操作具体解释
Linux的简单shell脚本中改动文件操作 1.Sed简单介绍 sed 是一种在线编辑器,它一次处理一行内容.处理时.把当前处理的行存储在暂时缓冲区中,称为"模式空间"(patt ...
- 机房收费系统——转换list泛型时,字段名称不正确应出现故障
因为之前对泛型研究了一番,所以就開始尝试着在机房收费系统重构中增加了泛型的使用. 可是到了做学生查看剩余金额这个功能的时候,还是依照之前的方法做的,可是在载入数据的时候班级这个框就没有显示出来--然后 ...
- Android Service组件在新进程绑定(bindService)过程
1.首先看两个样例 (1)进程内 Client端 public class CounterService extends Service implements ICounterService { .. ...
- ORACLE-015:ora-25153 暂时表空间为空,ora01652 无法通过128
写了一个复杂的select语句,突然oracle就报了:ora-25153 暂时表空间为空,这个错误,于是网上查了下.发现了例如以下解决方法:创建一个新的暂时表空间. 首先要有system权限.登录进 ...
- Git(二)Git几个区的关系与Git和GitHub的关联
前言 前面只是大概的介绍了一点基础的东西,接下来会更加深入的去了解一下Git. 一.Git的工作区.暂存区和版本库之间的区别和联系 1)工作区 在PC中能看得到的创建的一个管理仓库的目录.比如目录下G ...
- Java并发编程实践读书笔记(2)多线程基础组件
同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...
- CSS实现文字换行
强制不换行:div{ white-space:nowrap; } 自动换行: div{ word-wrap:break-word; word-break:normal; } 强制不换行 white-s ...