一、手工搭建平台
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中的兩個至關重要的屬性:
IIocManager 和
IAbpModuleManager 。
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接口的類。


參考文章: