一、手工搭建平台

1.创建项目

创建MVC5项目,手动引入Abp、Abp.Web、Abp.Web.Mvc、Abp.Web.Api
使用nuget添加Newtonsoft.Json、Castle.Core、Castle.Windsor
Install-Package Newtonsoft.Json -Version 8.0.3
Install-Package Castle.Windsor -Version 3.3.0

2.创建WebModule类

在App_Start下创建一个ZmBlogWebModule类型,DependsOn指示 ZmBlogWebModule依赖于AbpWebMvcModule,核心模块AbpWebMvcModule会在应用模块ZmBlogWebModule之前进行初始化,核心模块同时可以加载多个。
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

MvcApplication 要继承AbpWebApplication,重写Application_Start来初始化abp的内部初始化
public class MvcApplication : AbpWebApplication
{protected override void Application_Start(object sender, EventArgs e){base.Application_Start(sender, e);}
}

4.修改默认控制器

Home控制器必须集成于AbpController,否则会报错
好了,现在项目可以正常运行了

二、初始化过程

1.abp框架的启动是从Global.asax文件的Application_Start启动的,通过base去初始化。
2.AbpWebApplication的Application_Start方法中,通过AbpBootstrapper来将各个Abpmodule模块载入Abp框架中的AbpBootstrapper类在Abp.dll中, 其主要用于框架的基本配置的注册和初始化,AbpBootstrapper调用Initialize方法初始化
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的PreInitializesortedModules.ForEach(module => module.Instance.Initialize());//再执行所有Module的InitializesortedModules.ForEach(module => module.Instance.PostInitialize());//最后执行PostInitialize
}

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

5.应用程序结束将在AbpWebApplication中调用AbpBootstrapper的Dispose方法,Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。
 public virtual void ShutdownModules(){var sortedModules = _modules.GetSortedModuleListByDependency();sortedModules.Reverse();sortedModules.ForEach(sm => sm.Instance.Shutdown());}

三、AbpBootstrapper

在核心启动类AbpBootstrapper中的两个至关重要的属性:IIocManager 和 IAbpModuleManager 
IIocManager内部包装了一个Castle的依赖注入容器IWindsorContainer,所有类型的注册、解析、AOP机制的拦截器都是注册在该容器中的,将具体的注册还有解析功能分别包含在其父接口IIocRegistrar和IIocResolver中。
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

AbpCoreInstaller只是完成注册系统框架级的所有配置类。Abp支持自动完成符合Conventional(基于约定)的组件的注册。 Conventional 的规则要通过继承IConventionalDependencyRegistrar接口实现。
如下图,ABP中继承自IConventionalDependencyRegistrar接口的四个类。 其中BasicConventionalRegistrar设置了所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类都会被自动注册。
其他三个则分别注册AbpDbContext,ApiController和Controller的派生类。

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

参考文章:
https://www.cnblogs.com/farb/p/ABPModuleSystem.html
http://www.cnblogs.com/xuzimian/p/5561708.html
https://www.cnblogs.com/xuzimian/p/5579144.html
http://www.cnblogs.com/skabyy/p/7295533.html
http://www.cnblogs.com/1zhk/p/5277610.html
https://www.cnblogs.com/huaizuo/p/4836853.html

转载于:https://www.cnblogs.com/webenh/p/7985359.html

ABP架构学习系列二:ABP中配置的注册和初始化相关推荐

  1. 【转】ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...

  2. Camera2架构学习(二)——CameraServer和CameraProvider的启动初始化

    上一章讲的是从Framework下发命令,通过AIDL连接到相机设备服务.这一章讲服务的注册与启动.       服务层位于Camera Framework与Camera Provider之间,作为一 ...

  3. Linux学习系列二:Linux中的常用命令

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  4. 图机器学习(GML)图神经网络(GNN)原理和代码实现(前置学习系列二)

    图机器学习(GML)&图神经网络(GNN)原理和代码实现(PGL)[前置学习系列二] 上一个项目对图相关基础知识进行了详细讲述,下面进图GML networkx :NetworkX 是一个 P ...

  5. Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)

    继上一篇文章创建了项目后,本章我们进行项目的打包工作. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 打包步骤 1 准备环境 1.1 安装`PyInsta ...

  6. A.图机器学习(GML)图神经网络(GNN)原理和代码实现(前置学习系列二)

    图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...

  7. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  8. SpringCloud微服务架构学习(二)常见的微服务架构

    SpringCloud微服务架构学习(二)常见的微服务架构 1.Dubbo 阿里开源微服务框架 官网地址:http://dubbo.apache.org/en-us/ 简介: Dubbo是阿里巴巴SO ...

  9. SpringBoot源码学习系列之异常处理自动配置

    SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...

最新文章

  1. logistic 损失函数的解释
  2. MEMS传感器作为变革的驱动力
  3. 基础二维计算几何板子[预备知识]
  4. Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)
  5. 尼日利亚学生开发者,用阿里云PAI打造了卡通头像神器
  6. linux 清理内存的c函数,Linux C函数之内存配置函数
  7. CodeSmith终极玩法
  8. 为什么要用非关系数据库?
  9. vue键盘抬起_vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
  10. win7系统office向程序发送命令时出现错误
  11. Linux IO模型漫谈(4)- 非阻塞IO
  12. 平庸程序员的成长笔记
  13. web网页前端学习 案例一之制作网页表格
  14. 图片放大缩小js工具
  15. 短视频app源码开发,短视频录制的实现
  16. 算法竞赛宝典 分治算法 聪明的质检员
  17. 综述 | 从第一性原理出发,探索类脑智能研究的星辰大海
  18. GitHub标星30K+的Java面试八股文长啥样?
  19. 游戏行业使用高防IP有什么优势?
  20. 如何通过绩效考核对互联网人精准打击条条致命?

热门文章

  1. 论文计算机辅助辅助教学应用,计算机辅助教学应用论文.doc
  2. pythonfor循环加2_python – 在For循环中添加List(我最初将List设置为什么?)
  3. java应用中spring自动注入_Spring自动注入的几种方式
  4. cif t t操作流程图_Danish:STATA 操作正态检验、卡方检验和T检验
  5. linux系统管理考试试题及答案,Linux系统管理一测试题-附答案
  6. How to activate an Anaconda environment
  7. python中while。。。。else的用法
  8. 【java】方法中参数列表的应用
  9. 【java】创建一个JFrame,可以使得一个字符串用按钮进行颜色的选择
  10. linux 深度 root,深度刷机让毫秒级一键ROOT成为现实