本文主要参考官方文档"How Orchard works"以及Orchardch上的翻译。
 

源码分析应该做到庖丁解牛,而不是以管窥豹或瞎子摸象。所以先对Orchard架构有个整体的了解,以及对一些基本概念有所认识。

 
创建一个基于Web的CMS(内容管理系统)不同于创建一个普通的Web应用程序:它更像是建立一个应用程序容器。 这样一个系统,必须拥有优良的开放性、可扩展性。但是作为一个可扩展系统,它可能会面临应用程序"可用性"的挑战:在系统中的核心模块与未知的未来模块的组合,包括用户界面级别的整合。组合相对独立的模块中的小组件,从而形成一个连贯的整体,是Orchard是关键。
我们可以做个类比,如果Orchard对应操作系统,则核心模块对应系统软件,自定义模块对应第三方应用程序,菜单(前台或后台)对应开始菜单。Orchard启动的时候需要加载一些模块,对应操作系统开机启动的系统服务。
 
 本文解释了Orchard选择怎样的构架的,以及怎样获得灵活性和良好的用户体验。
 
一、Orchard架构

 

最上三层就是Orchard。可见Orchard运行于.Net/ASP.NET之上,使用了几个包括ASP.NET MVC在内的开源框架或类库。位于Orchard最底层的是Orchard框架(Orchard.Framework程序集),其上是核心模块(Core Modules)以及来自官方或非官方的其他模块(Modules)。实际上我们可以在任何一层上进行开发,通常我们是在Modules层开发,创建新的Module/Theme或修改已经存在的Module/Theme。
 
二、Orchard基础
Orchard CMS基于现有的框架和库构建,包括ASP.NET MVC,NHibernate,Autofac,Castle等。
 
三、Orchard框架(Orchard.Framework程序集)
Orchard.Framework程序集位于Orchard最底层,它包含应用程序引擎以及不适合分离到模块的功能。这些都是最基础的东西,甚至连最基本的模块将不得不依赖它。你可以把它看作是Orchard的基础类库。
 
四、Orchard核心模块(Orchard.Core项目及Orchard.Core程序集)
Orchard.Core项目中包含了一组Orhcard运行所必须的模块。其它模块可以安全地依赖到这些模块上,因为这些模块总是可用的。比如 feeds,navigation,routable模块。当然,就像上面所说,我们可以基于Orchard的任何一层进行开发,如果有必要,我们完全可以自己来设计"Core"。
 
五、模块(Moduls)
Orchard默认发行版包含了一些像blogging、pages的内置模块,并且也能很方便的创建第三方模块。
模块就是用于扩展Orchard的包含module.txt文件的ASP.NET MVC Area。 
模块通常包含事件处理程序(event handlers),内容类型(content types)和它们的默认渲染模板以及一些管理界面(Admin UI)。
对模块".csproj"文件或".csproj"引用文件的修改都能使模块自动被动态编译。也就是说可以不将模块编译成静态程序集甚至可以不使用Vistual Studio来创建或编辑模块。
 
六、主题(Themes)
主题可以让Orchard用户自定义站点显示界面,量身定制他们想要的站点风格。主题还可以有针对性的对Orchard模块所提供的任何模板进行样式重写、甚至是改变图像、布局等。
主题位于Orchard网站根目录下的Themes文件夹中,包含theme.txt文件。
 
七、租户/子站点(Tenants)
Orchard支持子站点,即一套程序、一个应用程序域部署多个不同域名或者相同域名不同Url前缀的站点。
 
参考资料:

Orchard源码分析(1):Orchard架构的更多相关文章

  1. Orchard源码分析(5):Host相关(Orchard.Environment.DefaultOrchardHost类)

    概述 Host 是应用程序域级的单例,代表了Orchard应用程序.其处理应用程序生命周期中的初始化.BeginRequest事件.EndRequest事件等. 可以简单理解为HttpApplicat ...

  2. Orchard源码分析(7.1):Routing(路由)相关

    概述 关于ASP.NET MVC中路由有两个基本核心作用,一是通过Http请求中的Url参数等信息获取路由数据(RouteData),路由数据包含了area.controller.action的名称等 ...

  3. Orchard源码分析(4.4):Orchard.Caching.CacheModule类

    概述 CacheModule也是一个Autofac模块.   一.CacheModule类 CacheModule将DefaultCacheManager注册为ICacheManager:       ...

  4. Orchard源码分析(6):Shell相关

    概述在Orchard中,提出子站点(Tenant)的概念,目的是为了增加站点密度,即一个应用程序域可以有多个子站点. Shell是子站点(Tenant)级的单例,换句话说Shell代表了子站点.对比来 ...

  5. Orchard源码分析(5.1):Host初始化(DefaultOrchardHost.Initialize方法)

    概述 Orchard作为一个可扩展的CMS系统,是由一系列的模块(Modules)或主题(Themes)组成,这些模块或主题统称为扩展(Extensions).在初始化或运行时需要对扩展进行安装:De ...

  6. Orchard源码分析(4.3):Orchard.Events.EventsModule类(Event Bus)

    概述 采用Event Bus模式(事件总线),可以使观察者模式中的观察者和被观察者实现解耦. 在.Net 中使用观察者模式,可以使用事件(委托)和接口(类).Orchard Event  Bus使用的 ...

  7. Orchard源码分析(3):Orchard.WarmupStarter程序集

    概述 Orchard.WarmupStarter程序集包含三个类:WarmupUtility.WarmupHttpModule和Starter<T>.该程序集主要为Orchard应用启动初 ...

  8. Orchard源码分析(2):Orchard.Web.MvcApplication类(Global)

    概述 分析一个的ASP.NET项目源码,首先可以浏览其项目结构,大致一窥项目其全貌,了解项目之间的依赖关系.其次可以浏览Web.config和Global.asax文件,找到应用程序的入口点. 本 文 ...

  9. Orchard源码分析(1):插件式的支持——模块和主题

    在Orchard,模块和主题都是可以插拔式的,在源码处理时,用类型(参考:DefaultExtensionTypes)区分,都没太大的本质区别,以下都称做模块. 插件的支持,实现分以下几步: 搜集模块 ...

随机推荐

  1. 【USACO 1.4】Arithmetic Progressions

    /* TASK: ariprog LANG:C++ URL:http://train.usaco.org/usacoprob2?a=PA9lOcZrdWq&S=ariprog SOLVE:平方 ...

  2. 【CodeForces 697C】Lorenzo Von Matterhorn(LCA)

    Least Common Ancestors 节点范围是1~1e18,至多1000次询问. 只要不断让深的节点退一层(>>1)就能到达LCA. 用点来存边权,用map储存节点和父亲连边的权 ...

  3. 【BZOJ-1455】罗马游戏 可并堆 (左偏树)

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1355  Solved: 561[Submit][Status][Discuss] ...

  4. 【bzoj1912】 Apio2010—patrol 巡逻

    http://www.lydsy.com/JudgeOnline/problem.php?id=1912 (题目链接) 题意 给出一棵树,要求在树上添加K(1 or 2)条边,添加的边必须经过一次,使 ...

  5. PowerShell控制台快捷键

    按键 功能 ← 光标向左移动一个字符 Ctrl + ← 光标向左移动一个单词 → 光标向右移动一个字符 Ctrl + → 光标向右移动一个单词 Home键 光标移动到行首 End键 光标移动到行尾 D ...

  6. angularjs 手动加载

    利用ng-app可以完成自动加载,如果不利用ng-app.那么使用bootstrarp实现手动加载模块 <html> <head> <script src="a ...

  7. CentOS安装MongoDB

    1. touch /etc/yum.repos.d/mongodb.repo vi /etc/yum.repos.d/mongodb.repo [mongodb]        name=MongoD ...

  8. SampleDateFormat进行日期格式化

    我们生成的日期 ,可能不是我们想要的格式,这时候,就要用到SampleDateFormat类的format方法转换一下, SampleDateFormat是java.text包下的一个常用日期类 这个 ...

  9. TcpClient类与TcpListener类

    TcpClient类 //构造方法1 TcpClient t = new TcpClient(); t.Connect(); //构造方法2 IPEndPoint iep = ); TcpClient ...

  10. collectionView

    // /* UICollectionView 类是iOS6 新引进的API,用于展示集合视图, 布局更加灵活,可实现多列布局,用法类似于UITableView类. - 更新视图: [collectio ...