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

一、手工搭建平台

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的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接口的类。

 
 

 

参考文章:

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

时间: 2024-10-24 01:12:14

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

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

本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zhang ,他的博客是https://www.cnblogs.com/1zhk/ 一.什么是ABP ASP.NET Boilerplate(ABP)是现代新的Web应用程序的最佳实践和最流行的工具的起点.它的目标是实体模型.通用应用程序框架和项目模板. ABP是一个建立在最新的ASP.NET的MVC和W

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

由于公司的项目才接触到ABP这个框架,当时就觉得高大上,什么IOC.AOP.ddd各种专业词汇让人激情 澎湃,但在使用过程中碰到了许多坑,可能也许是没有去看源码导致的,但工作确实没有那么多时间让人去慢慢研究.很久之前想手动搭建这个框架了,但是各种理由,你懂的.但是要在技术上得到大的提升就得静的下心去研究,学到大神的思想和精髓,运用到实际中去,才能去体验更开阔的天地. 本文以创建博客为思路,一步步构建整个项目,在摸索中进步,也希望能够帮助到有需要的人. 一.基础架构 第一部分主要是搭建好整个项目的

Spark-SparkSQL深入学习系列二(转自OopsOutOfMemory)

   /** Spark SQL源码分析系列文章*/     Spark SQL的核心执行流程我们已经分析完毕,可以参见Spark SQL核心执行流程,下面我们来分析执行流程中各个核心组件的工作职责.     本文先从入口开始分析,即如何解析SQL文本生成逻辑计划的,主要设计的核心组件式SqlParser是一个SQL语言的解析器,用scala实现的Parser将解析的结果封装为Catalyst TreeNode ,关于Catalyst这个框架后续文章会介绍. 一.SQL Parser入口    

Android开发系列二之窗口Activity的生命周期_Android

在上篇文章给大家介绍了android开发系列一之用按钮实现显示时间,感兴趣的朋友可以点击阅读详情. 在Activity从创建到销毁的过程中需要在不同的阶段调用7个生命周期的方法这7个生命周期方法定义如下: protected void onCreate(Bundle savedInstanceState) protected void onStart() protected void onResume() protected void onPause() protected void onSto

Android开发系列二之窗口Activity的生命周期

在上篇文章给大家介绍了android开发系列一之用按钮实现显示时间,感兴趣的朋友可以点击阅读详情. 在Activity从创建到销毁的过程中需要在不同的阶段调用7个生命周期的方法这7个生命周期方法定义如下: protected void onCreate(Bundle savedInstanceState) protected void onStart() protected void onResume() protected void onPause() protected void onSto

Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]

原文:Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中] 前言 本来一直参见于微软官网进行学习的, 官网网址http://www.asp.net/web-api.出于自己想锻炼一下学习阅读英文文章的目的,又可以学习下微软新发布的技术,其实也很久了,但自己菜鸟一枚,对自己来说都是新技术了.鉴于以上两个原因,本人打算借助google翻译和有道词典,来翻译学习这个系列,并通过博客园来记录自己的翻译学习过程.由于自己阅读水平的确太菜,在借助工具的情况下,有时候搞出来的也是蹩脚的语句,

iOS中CoreData数据管理系列二——CoreData框架中三个重要的类

iOS中CoreData数据管理系列二--CoreData框架中三个重要的类 一.引言     在上一篇博客中,介绍了iOS中使用CoreData框架设计数据模型的相关步骤.CoreData框架中通过相关的类将数据--数据模型--开发者无缝的衔接起来.NSManagedObjectModel对应数据模型,即上篇博客中我们创建的.xcdatamodeld文件:NSPersistentStoreCoordinator相当于数据库与数据模型之间的桥接器,通过NSPersistentStoreCoord

服务器部署十大问题系列二:配置与升级

本系列文章介绍数据中心服务器部署前后整个过程需要考虑到的十个基础问题.第一部分<服务器部署十大问题系列一:软件与硬件>中,我们介绍了新增服务器对当前设施有哪些影响,以及软硬件方面需要考虑的问题. 本文为系列二,主要介绍在配置服务器时应该注意的问题,因为即使是对最能干和熟练的IT专业人士来说,手动配置也不仅耗时也是个易错的过程.另外,新的服务器需要有正确的打补丁和升级方式等等. 服务器配置有没有清晰的模板? 新的服务器需要通过安装软件.设置服务器角色.设定IP地址,通过域名系统和Active D

使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理【转】

转自:https://www.qcloud.com/community/article/598765?fromSource=gwzcw.117333.117333.117333 这是<使用腾讯云 GPU 学习深度学习>系列文章的第二篇,主要介绍了 Tensorflow 的原理,以及如何用最简单的Python代码进行功能实现.本系列文章主要介绍如何使用 腾讯云GPU服务器 进行深度学习运算,前面主要介绍原理部分,后期则以实践为主. 往期内容: 使用腾讯云 GPU 学习深度学习系列之一:传统机器学