开发者社区> 芝麻软件> 正文

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

简介: 一、手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp、Abp.Web、Abp.Web.Mvc、Abp.Web.Api 使用nuget添加Newtonsoft.Json、Castle.Core、Castle.
+关注继续查看

一、手工搭建平台

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

 

 

 
参考文章:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上)
【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上)
44610 0
微服务架构、新特性与注册中心|学习笔记(四)
快速学习微服务架构、新特性与注册中心
54 0
Dubbo+zookeeper微服务架构之服务注册与发现的简单使用
Dubbo+zookeeper微服务架构之服务注册与发现的简单使用
191 0
微服务架构 | *3.5 Nacos 服务注册与发现的源码分析
为方便理解与表达,这里把 Nacos 控制台和 Nacos 注册中心称为 Nacos 服务器(就是 web 界面那个),我们编写的业务服务称为 Nacso 客户端; Nacos 客户端将自己注册进 Nacos 服务器。《1. 服务如何注册进 Nacos 注册中心》主要从 Nacos 客户端角度解释如何发送信息给 Nacos 服务器;《2. Nacos 服务器注册服务》主要从 Nacos 服务器角度解释注册原理; 《3. 客户端查询所有服务实例》将从服务消费者和提供者的角度,解释服务消费者如何获取提供者的所有实例。服务消费者和提供者都是 Nacos 的客户端;
218 0
微服务架构 | 3.4 HashiCorp Consul 注册中心
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。它提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案;
149 0
微服务架构 | 3.3 Apache Zookeeper 注册中心
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等;
121 0
微服务架构 | 3.2 Alibaba Nacos 注册中心
Nacos 致力于解决微服务中的统一配置、服务注册与发现等问题。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理;
545 0
微服务架构 | 3.1 Netflix Eureka 注册中心
Eureka 是 Netflix 开发的服务发现框架,本身是一个基于 REST 的服务,主要用于定位运行在 AWS 域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的; Spring Cloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 Spring Cloud 的服务发现功能;
195 0
微服务架构 | 3. 注册中心与服务发现
注册中心用来集中管理微服务,实现服务的注册,发现,检查等功能;
1263 0
+关注
芝麻软件
编程语言,框架相关专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
基于英特尔®架构的阿里云服务网格ASM技术加速应用服务加密通
立即下载
以银行架构视角解读和落实银行数字化转型的两份重磅指导文件
立即下载
云原生架构容器&微服务优秀案例集
立即下载