一、手工搭建平台

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.
Install-Package Castle.Windsor -Version 3.3.

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的PreInitialize
sortedModules.ForEach(module => module.Instance.Initialize());//再执行所有Module的Initialize
sortedModules.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中的两个至关重要的属性:IIocManagerIAbpModuleManager 
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接口的类。

 

 
参考文章:

ABP架构学习系列二:ABP中配置的注册和初始化的更多相关文章

  1. ABP架构学习系列一 整体项目结构及目录

    本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zha ...

  2. ABP架构学习系列

    ABP实践学习系列 ABP Zero 本地化语言的初始化和扩展 ABP Zero 导航菜单之角色权限 ABP Zero示例项目问题总结  ABP后台服务之作业调度Quartz.NET   ABP架构学 ...

  3. ABP架构学习系列三:手工搭建ABP框架

    由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢 ...

  4. ABP源码分析二:ABP中配置的注册和初始化

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

  5. ABP架构学习系列四:集成Dapper

    之前,一直想集成Dapper到项目中,但是一直没成功,今天把abp升级到最新版,然后按教程来,就可以了,呵呵    现在,基于上一篇的源码进行升级和集成dapper,将abp升级到3.8.2   官方 ...

  6. 源码学习系列之SpringBoot自动配置(篇二)

    源码学习系列之SpringBoot自动配置(篇二)之HttpEncodingAutoConfiguration 源码分析 继上一篇博客源码学习系列之SpringBoot自动配置(篇一)之后,本博客继续 ...

  7. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

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

    项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...

  9. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

随机推荐

  1. 使用vee-validate表单插件是如何设置中文提示?

    最近在写vue表单验证的时候,在网上找到一款不错的插件vee-validate,在使用的过程中发现配置不了中文提示,这就很苦恼了,基本上网上的配置办法我都看过,都是有问题的,比如这种 import z ...

  2. maven项目对于测试时“无法加载主类”的解决方案

    1.右键maven项目,选择  build path --------->Configure Build Path  ,执行下列操作,保存即可.

  3. Dos命令的巧用

    豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可以轻易的办到很多事 ...

  4. Android官方命令深入分析之AVD Manager

    作者:宋志辉 AVD Manager提供了一个图形用户接口,通过它你能够创建和管理AVDs. 你能够通过下面方式执行AVD Manager: Eclipse:选择 Window > Androi ...

  5. iOS 开发人员不可缺少的75个工具

    原文出处: Ben Scheirman 译文出处: Njuxjy 假设你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完毕不同的任务. 软件开发相同如此. 你能够从软件开发人员怎样使用工具 ...

  6. Java 并发专题 : Executor具体介绍 打造基于Executor的Webserver

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章非常少有人看啊~哈~ 今天准备具体介绍jav ...

  7. HDU 4960 Another OCD Patient(记忆化搜索)

    HDU 4960 Another OCD Patient pid=4960" target="_blank" style="">题目链接 记忆化 ...

  8. opencl 和Renderscript总结

    在android上要开发opencl.手机端要有libopencl.so文件(也就是opencl驱动).可是如今android手机端非常少有这个文件.原因是尽管AMD.Intel.NVIDIA.苹果等 ...

  9. 用node.js实现mvc相册资源管理器

    摘要:通过前两天的学习我大概学了了,用formidable模块文件上传,express框架,以及利用fs模块进行文件读取,今天我学习了如何用这些知识来制作相册,暂没有数据库,所以做的也是本地的资源管理 ...

  10. CentOS下nginx php mysql 环境搭建

    CentOS下搭建PHP运行环境. 首先是在虚拟机上装好一个命令行的CentOS,如果只是弄服务器的话,不要装图形界面,会比较卡. 一.安装编译工具及库文件 yum -y install make z ...