Orchard Framework作为框架它与类库最大的区别就是框架是将一系列零散的组件组合在一起形成一个整体,接下来就对Orchard Framework如何分析Orchard如何将相关组件结合在一起的,也就是这个框架的启动过程。
Orchard的启动过程可以按以下文件查看。
- Orchard.Web.Global.asax:这个文件主要是包含了应用级事件的处理代码,一般用于ASP.NET程序启动时初始化等等,在Orchard里面也是通过Application_Start事件来对应用程序进行初始化工作(这里的初始化主要是定义HostInitialization、HostBeginRequest和HostEndRequest三个委托,并将其交给Starter去处理)。
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:启动器主要有三个作用
- 结合WarmupHttpModule,在启动过程中阻止请求,待启动完成后处理请求队列。
- 记录启动过程中出现的错误,如果存在错误会通过监听到的请求事件来重新初始化。
- 创建IoC容器,这里也是最重要的一点,通过Global.asax中定义的HostInitialization,来完成整个基础容器的创建。
3.Orchard.Framework.DefaultOrchardHost.cs:Host是Orchard启动的整个核心,它的启动主要有3个步骤:
- 加载拓展模块。
- 监控拓展模块。
- 创建和激活Shell(多租户)。
代码如下:
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初始化的步骤都是可以借鉴的。