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之外,它主要過程如下圖所示。