zoukankan      html  css  js  c++  java
  • 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接口的类。

     
     
    参考文章:

  • 相关阅读:
    Web开发需要掌握的
    使用this关键字,构造函数的相互调用
    FCKEditor.Net在Asp.Net MVC中的配置
    技术收集
    System.Collections命名空间
    C#中的托管堆,托管
    C#中的数据类型
    sql server部分主要代码
    Visual C#常用函数和方法集汇总
    C#委托和事件
  • 原文地址:https://www.cnblogs.com/xcsn/p/7941541.html
Copyright © 2011-2022 走看看