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

 

 

 
参考文章:

相关文章
|
3天前
|
设计模式 负载均衡 API
微服务架构中的服务发现与注册中心
【6月更文挑战第19天】在微服务架构的海洋中,服务发现和注册中心扮演着灯塔的角色,指引着服务间的通信。本文将深入探讨服务发现的机制、注册中心的实现,以及它们如何协同工作以维护一个健康、动态的服务网络。我们将通过比喻和实例,揭示这一复杂系统背后的简洁之美。
11 3
|
16天前
|
设计模式 负载均衡 API
深入理解微服务架构中的服务发现与注册机制
在微服务架构的海洋中,服务发现和注册机制如同星辰导航,指引着服务的互联。本文将揭开服务发现与注册的神秘面纱,探讨它们如何在动态变化的云环境中确保服务间的高效通信。我们将从基本概念出发,逐步深入到实现原理,最后探讨如何在实际项目中应用这些机制以提升系统的可扩展性、可靠性和敏捷性。
|
1月前
|
缓存 负载均衡 中间件
微服务架构下的服务发现与注册机制
【5月更文挑战第23天】在微服务架构的动态环境中,服务实例可能会频繁地上下线。为了维护系统的高可用性和伸缩性,服务发现与注册机制成为了一个关键因素。本文将探讨服务发现与注册的重要性,分析不同的实现策略,并展示如何利用这些机制来优化后端服务的交互流程。通过深入解析服务发现的多种模式及其对系统设计的影响,我们将提供一个清晰的指导,帮助开发者构建更加健壮和灵活的微服务系统。
|
1月前
|
缓存 算法 Apache
微服务架构下的服务发现与注册机制
【5月更文挑战第18天】 随着现代软件系统向着分布式和微服务架构演进,服务发现与注册成为确保系统弹性和可伸缩性的关键因素。本文将探讨在微服务环境下实现服务发现与注册的模式,分析其必要性,并深入讨论常见的解决方案以及面临的挑战。文中不仅介绍了服务发现的基本原理和流程,还对流行的服务发现工具如Consul、Etcd和Zookeeper进行了比较,最后提出了一套优化策略以增强系统的鲁棒性和性能。
|
1月前
|
JSON JavaScript 前端开发
KOI 后台新的架构下,webshop如何消费后台服务 - websocket 初始化
KOI 后台新的架构下,webshop如何消费后台服务 - websocket 初始化
|
1月前
|
缓存 微服务
01.【微服务架构】服务注册与发现:AP和CP,你选哪个? -- 客户端容错
【5月更文挑战第12天】客户端容错机制确保在服务端或注册中心故障时仍能正确发送请求。当服务端崩溃,由于延迟,客户端一段时间内仍会尝试发送请求。客户端应实施 failover 策略,即检测到调用失败后,切换到其他节点重试,并将故障节点从列表移除。延时通常等于服务端与注册中心心跳间隔加通知时间。若网络问题导致客户端无法访问服务端,客户端应发送心跳以检测服务端状态,成功则恢复,连续失败则视为崩溃。若客户端无法连接注册中心,它应使用本地缓存并考虑退出。
25 1
01.【微服务架构】服务注册与发现:AP和CP,你选哪个? -- 客户端容错
|
1月前
|
Kubernetes API 调度
Kubernetes学习-核心概念篇(二) 集群架构与组件
Kubernetes学习-核心概念篇(二) 集群架构与组件
|
1月前
|
关系型数据库 MySQL 数据库
MySQL集群 双主架构(配置命令)
MySQL集群 双主架构(配置命令)
|
1月前
|
微服务
01.【微服务架构】服务注册与发现:AP和CP,你选哪个?-- 高可用性
【5月更文挑战第4天】注册中心通过心跳检测服务端状态,当心跳失败时预判服务端崩溃并通知客户端停止使用。心跳机制应对网络不稳定,需平衡重试次数与间隔,避免误判和延迟。即使如此,从服务端宕机到客户端获知仍存在时间差,因此需要客户端具备容错能力。
34 0
|
1月前
|
微服务
01.【微服务架构】服务注册与发现:AP和CP,你选哪个?-- 服务端崩溃检测
【5月更文挑战第3天】保证服务注册与发现的高可用需关注三个方面:服务端崩溃检测、客户端容错和注册中心选型。服务端崩溃时,注册中心通过心跳检测来识别,若心跳中断,立即通知客户端服务不可用,同时持续尝试恢复心跳。若一段时间后仍无法连接,则断定服务端彻底崩溃。这种方法兼顾及时故障通知和防止误判。
42 8