随笔分类 - Orchard
摘要:概述默认情况下,ASP.NET MVC内置的DefaultControllerFactory负责Controller实例的创建。Orchard定义了一个继承自DefaultControllerFactory类的Orchard.Mvc.OrchardControllerFactory类并在OrchardStarter类中进行注册: // 以下代码来在Orchard.Environment.OrchardStarter类 ControllerBuilder.Current.SetControllerFactory(newOrchardControllerFactory());Orchard...
阅读全文
摘要:概述关于ASP.NET MVC中路由有两个基本核心作用,一是通过Http请求中的Url参数等信息获取路由数据(RouteData),路由数据包含了area、controller、action的名称等信息。只有获取了匹配的路由数据,才有可能转入ASP.NET MVC管道;二是根据由规则生成Url,比如要根据某些数据生成View上显示的链接。Orchard对路由进行扩展主要基于如下原因:(1)、路由定义在各个模块中。在Orchard应用程序初始化时将分散在各个模块的路由定义收集起来统一注册。(2)、路由定义一次,对于多Shell系统,则会被多次注册以匹配Shell的前缀。(3)、当请求进入时需要确
阅读全文
摘要:概述Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少。MVC提供了非常多的扩展点,本文主要关注Orchard所做的扩展。主要集中在如下几个方面:1、Routing(路由)相关2、Controller相关3、ViewEngines相关4、Model绑定(Binding)相关5、Model验证器(Validator)相关我们将分几个篇幅来分别分析。参考资料:How ASP.NET MVC Works(强烈推荐)ASP.NET MVC中你必须知道的13个扩展点ASP.NET MVC 请求生命周期ASP.NET MVC 4(M
阅读全文
摘要:概述CacheModule也是一个Autofac模块。一、CacheModule类CacheModule将DefaultCacheManager注册为ICacheManager: publicclassCacheModule:Module{ protectedoverridevoidLoad(ContainerBuilderbuilder) { builder.RegisterType<DefaultCacheManager>() .As<ICacheManager>() .InstancePerDependency(); }//... }如果类有一个接受ICacheM
阅读全文
摘要:概述在Orchard中,提出子站点(Tenant)的概念,目的是为了增加站点密度,即一个应用程序域可以有多个子站点。Shell是子站点(Tenant)级的单例,换句话说Shell代表了子站点。对比来看,Host是应用程序域级的单例,代表了Orchard应用程序。本文将分析Shell相关的各种类型。一、获取ShellSettings在 DefaultOrchardHost类的CreateAndActivateShells方法中,由Shell设置管理器 ShellSettingsManager从~/App_Data/Sites目录的一级子目录中搜索Settings.txt文件,然后通过Shell
阅读全文
摘要:EndRequest事件处理的作用是处理完"处理引擎(ProcessingEngine)"中的任务(Task)。 voidIOrchardHost.EndRequest() { Logger.Debug("EndRequest"); EndRequest(); } protectedvirtualvoidEndRequest() {// Synchronously process all pending tasks. It's safe to do this at this point// of the pipeline, as the requ
阅读全文
摘要:BeginRequest事件处理的作用是确保所有Shell已经加载,或者在扩展有变化的时候重新加载。 voidIOrchardHost.BeginRequest() { Logger.Debug("BeginRequest"); BeginRequest(); }protectedvirtualvoidBeginRequest() {// Ensure all shell contexts are loaded, or need to be reloaded if// extensions have changed MonitorExtensions(); BuildCur
阅读全文
摘要:概述Orchard作为一个可扩展的CMS系统,是由一系列的模块(Modules)或主题(Themes)组成,这些模块或主题统称为扩展(Extensions)。在初始化或运行时需要对扩展进行安装:DefaultOrchardHost.SetupExtensions方法。当添加新的扩展、删除扩展或修改扩展源码后,需要通知扩展加载器(Extension Loader)重新加载或完成一些清理工作,所以需要进行监视:DefaultOrchardHost.MonitorExtensions方法。Orchard 是一个多租户(Tenant)系统,也就是我们通常所是说的子站点,它允许一个Orchard应用程序
阅读全文
摘要:概述Host 是应用程序域级的单例,代表了Orchard应用程序。其处理应用程序生命周期中的初始化、BeginRequest事件、EndRequest事件等。 可以简单理解为HttpApplication的功能转移到了Host身上。从源码角度上看,Host对应的是实现了IOrchardHost接口的 DefaultOrchardHost类。回顾一下之前对Orchard.Web.MvcApplication类的分析。在Orchard启动时,会创建一个DefaultOrchardHost对象:DefaultOrchardHost类涉及到的内容相当复杂,所以用几个独立的篇幅来表述。一、Host初始化
阅读全文
摘要:概述采用Event Bus模式(事件总线),可以使观察者模式中的观察者和被观察者实现解耦。在.Net 中使用观察者模式,可以使用事件(委托)和接口(类)。Orchard Event Bus使用的是接口的形式,这样方便将“观察者”注册到Autofac容器中。EventsModule模块是构成Orchard Event Bus的一部分。这里先分开分析Orchard Event Bus涉及的类型和知识点,然后在将他们组合起来分析Orchard Event Bus的机制。一、Registration Source 首先EventsModule也是一个Autofac模块。其注册了一个EventsR...
阅读全文
摘要:与CollectionOrderModule一样,LoggingModule也是一个Autofac模块。它以属性注入的方式给需要日志服务的对象设置Logger。 如果一个类有Orchard.Logging.ILogger型的公共可写实例属性(忽略索引),Autofac容器在解析(Resolve)该类的时 候,将"注入"一个ILogging实现类的实例。Orchard默认会注入一个CastleLogger对象。当然Orchard也允许一个类中有多个 ILogger型属性,也支持将CastleLogger替换成其他Logger。如有必要,请先了解一下简单工厂模式、抽象工厂模式和
阅读全文
摘要:CollectionOrderModule类是一个Autofac模块(Module,将一系列组件和相关的功能包装在一起),而非Orchard模块。其作用是保证多个注册到容器的组件能按FIFO(First In First Out)的顺序提取。下面举例说明: 1、创建ICustomerService接口: publicinterfaceICustomerService{ }2、创建两个实现ICustomerService接口的类: publicclassDefaultCustomerService:ICustomerService{ } publicclassVIPCustomerService
阅读全文
摘要:概述OrchardStarter类是个静态类,主要作用是配置Autofac容器以及创建IOrchardHost(DefaultOrchardHost)对象,分别对应CreateHost和CreateHostContainer这两个静态方法。一、CreateHost方法CreateHost方法接受一个委托参数,返回一个IOrchardHost(Orchard宿主)型实例: publicstaticIOrchardHostCreateHost(Action<ContainerBuilder> registrations)该方法在Orchard的MvcHttpApplication类的H
阅读全文
摘要:概述Orchard.WarmupStarter程序集包含三个类:WarmupUtility、WarmupHttpModule和Starter<T>。该程序集主要为Orchard应用启动初始化服务。一、WarmupUtility类 该类是一个静态工具类,包含一个静态只读String型字段WarmupFilesPath,以及三个方法EncodeUrl、ToUrlString和DoBeginRequest。1、WarmupFilesPath其值为"~/App_Data/Warmup/"。 publicstaticreadonlystringWarmupFilesPat
阅读全文
摘要:概述分析一个的ASP.NET项目源码,首先可以浏览其项目结构,大致一窥项目其全貌,了解项目之间的依赖关系。其次可以浏览Web.config和Global.asax文件,找到应用程序的入口点。本 文主要分析Orchard项目的Global.asax文件,而真正的分析入口点在Global.asax的CodeBehind文件 Global.asax.cs中,即Orchard.Web.MvcApplication类(以下简称MvcApplication类)。MvcApplication类处理了三个事件Start,BeginRequest和EndRequest。其中是否真有名为"Start&q
阅读全文
摘要:本文主要参考官方文档"How Orchard works"以及Orchardch上的翻译。源码分析应该做到庖丁解牛,而不是以管窥豹或瞎子摸象。所以先对Orchard架构有个整体的了解,以及对一些基本概念有所认识。创建一个基于Web的CMS(内容管理系统)不同于创建一个普通的Web应用程序:它更像是建立一个应用程序容器。 这样一个系统,必须拥有优良的开放性、可扩展性。但是作为一个可扩展系统,它可能会面临应用程序"可用性"的挑战:在系统中的核心模块与未知的未来模块的组合,包括用户界面级别的整合。组合相对独立的模块中的小组件,从而形成一个连贯的整体,是Orch
阅读全文