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

 

 

 
參考文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM