1 protected void Application_Start() { 2 RegisterRoutes(RouteTable.Routes); 3 _starter = new Starter<IOrchardHost>(HostInitialization, HostBeginRequest, HostEndRequest); 4 _starter.OnApplicationStart(this); 5 }注:這裡已經引用Autofac定義了對路由表等信息注冊的方法並且在HostInitialization調用了IoC容器創建,後續詳解。
1 private static IOrchardHost HostInitialization(HttpApplication application) { 2 var host = OrchardStarter.CreateHost(MvcSingletons); 3 4 host.Initialize(); 5 6 // initialize shells to speed up the first dynamic query 7 host.BeginRequest(); 8 host.EndRequest(); 9 10 return host; 11 } 12 13 static void MvcSingletons(ContainerBuilder builder) { 14 builder.Register(ctx => RouteTable.Routes).SingleInstance(); 15 builder.Register(ctx => ModelBinders.Binders).SingleInstance(); 16 builder.Register(ctx => ViewEngines.Engines).SingleInstance(); 17 }
2.Orchard.WarmupStarter.Starter.cs:啟動器主要有三個作用
3.Orchard.Framework.DefaultOrchardHost.cs:Host是Orchard啟動的整個核心,它的啟動主要有3個步驟:
1 IEnumerable<ShellContext> BuildCurrent() { 2 if (_shellContexts == null) { 3 lock (_syncLock) { 4 if (_shellContexts == null) { 5 SetupExtensions(); 6 MonitorExtensions(); 7 CreateAndActivateShells(); 8 } 9 } 10 } 11 return _shellContexts; 12 }
小結: 本章分析了Orchard的主要啟動過程,除開WarmupStarter之外,它主要過程如下圖所示。
另本系列主要強調從Orchard中能夠學到什麼,在這裡我認為Orchard在啟動時使用隊列阻止請求以及Orchard初始化的步驟都是可以借鑒的。