Orchard 源代码的组织结构(转)
基于Orchardv1.1版的源代码,描述了Orchard解决方案中各个项目的作用。你可以用VisualStudio打开Orchard解决方案对照查看。
Modules
Modules目录是一个VS解决方案目录,它包含了Orchard的模块项目。所有的模块项目都是一个ASP.NETMVC web应用程序项目。
Modules\Lucene
Lucene模块可以让站点使用Lucene.NET进行索引。索引模块利用此搜索引擎,实现网站的全文检索。
Modules\Orchard.ArchiveLater
ArchiveLater模块支持按计划归档功能。
Modules\Orchard.Blogs
Blogs模块提供了管理、呈现博客和博客文章的功能。
Modules\Orchard.CodeGeneration
CodeGeneration模块提供了创建Orchard组件的命令行工具。
Modules\Orchard.Comments
Comments模块提供了管理、呈现评论的功能。此评论功能以ContentPart形式提供,可以适用于各种内容。
Modules\Orchard.ContentTypes
ContentTypes模块可以提供创建和修改内容类型的管理界面。
Modules\Orchard.DesignerTools
DesignerTools模块包含了一个可以帮助web开发人员开发主题的工具。这个工具可以显示所有当前的Shap和一些信息,有助我们自定义主题和模板使用。
Modules\Orchard.Email
Email模块提供了邮件发送的功能。
Modules\Orchard.Experimental
Experimental模块提供了以下类型的调试工具:
分析工具:这个工具可以帮助我们配置Orchard应用。
Web命令行工具:这个工具可以让网站管理员在Web界面中执行Orchard命令行的功能。
测试列表工具:这个工具可以定义一些内容帮助测试列表功能。
Modules\Orchard.ImportExport
ImportExport模块提供导入导出Orchard内容数据的功能。
Modules\Orchard.Indexing
Indexing模块可以提供全站索引。通过此模块生成索引供搜索模块使用,从而实现全站搜索的功能。该模块需要依赖于Lucene模块。
Modules\Orchard.jQuery
jQuery模块包含了jquery脚本和一些相关的脚本库。
Modules\Orchard.Lists
Lists模块提供了一个预设容器的功能。
Modules\Orchard.Localization
Localization模块提供了本地化内容项的功能。
Modules\Orchard.Media
Media模块提供了管理和呈现多媒体的功能。它当前仅支持图片文件。文件存储在当前Orchard系统中,可以是一个物理文件系统或者用Azureblob存储。
Modules\Orchard.MediaPicker
MediaPicker模块提供了一个在Html编辑器中浏览、上传和选择图片的功能。
Modules\Orchard.Messaging
Messaging模块包含了消息的设置功能。
Modules\Orchard.Migrations
Migrations模块提供了根据Record类创建和升级数据结构的命令行工具。
Modules\Orchard.Modules
Modules模块提供了网站管理员管理模块安装、启用等功能的管理界面。
Modules\Orchard.MultiTenancy
MultiTenancy模块可以是多个逻辑站点运行在一个物理的web站点上。这提高了在一台服务器或托管主机上的站点密度。
Modules\Orchard.Packaging
Packaging模块提供将模块打包为OPC文件格式的功能。
Modules\Orchard.Pages
Pages模块提供了管理和呈现CMS页面的功能。它包含了一个预定页面内容类型。
Modules\Orchard.PublishLater
PublishLater模块支持内容以草稿形式创建并按计划时间发布的功能。
Modules\Orchard.Recipes
Recipes模块支持Orchard网站自动配置的功能。
Modules\Orchard.Roles
Roles模块提供一个分配角色给用户的功能。它还提供了一个设置默认角色给其他模块定义权限集的功能。
Modules\Orchard.Scripting
Scripting模块可以提供一个执行简单脚本语言的功能。
Modules\Orchard.Scripting.Dlr
Scripting.Dlr模块可以提供一个执行DLR脚本语言的功能。
Modules\Orchard.Search
Search模块可管理搜索索引和提供用户查询Orchard站点的接口。
Modules\Orchard.Setup
Setup模块提供初始化安装Orchard应用程序的功能。这个模块在安装完成后将自动禁用。
Modules\Orchard.Tags
Tags模块提供管理和呈现所有内容标签的功能。
Modules\Orchard.Themes
Themes模块提供了一个设置Orchard应用程序主题的管理界面。
Modules\Orchard.Users
Users模块提供了管理用户的功能。
Modules\Orchard.Warmup
Warmup模块提供一种在应用程序初始化过程中生成静态网页的功能。
Modules\Orchard.Widgets
Widgets模块提供了Orchard小部件添加到页面上的管理界面。
Modules\TinyMce
TinyMce模块提供了富文本编辑器的功能。
Specs
Specs文件夹包含了以下项目:
Orchard.Profile:提供显示网站运行情况和性能的功能。
Orchard.Specs:包含编写使用集成测试specflow风格。特定功能信息包含在*.Feature文件中。
Tests
Tests文件夹包含了以下项目:
Orchard.Core.Tests:是一个测试Orchard核心功能的测试项目。
Orchard.Framework.Tests:是一个测试Orchard框架的测试项目。
Orchard.Tests.Modules:是一个测试Orchard模块的测试项目。他下面的子目录对应不同的Orchard模块。
Orchard.Web.Tests:是一个测试Orchard网站的测试项目。
Themes
Themes文件夹包含了Orchard主题项目,可以在此项目中添加新的主题,不同的主题对应于不同的子目录。
Tools
Tools文件夹包含了用于编译Orchard解决方案的工具的源代码。它也包含了Orchard项目的命令行工具,你可以用它来运行Orchard中定义的一些命令以自动执行管理任务。
Orchard.Core
Orchard核心功能项目包含Orchard中核心模块和内容类型,如:feeds部件、主题部件、导航部件、通用部件、路由部件和内容文本部件。
Orchard.Framework
Orchard框架项目包含Orchard所使用的各种类库。如:缓存、集合、命令、内容管理、数据访问等等。同时也包含了大量的接口定义和属性定义。
Orchard.Web
Orchard.Web项目是一个MVC应用程序项目。这是你应用程序实际运行的项目。它是整个解决方案的启动项目。它包含了OrchardCMS系统的核心平台的程序集文件,是Orchard主机应用程序。
其他注释
Orchard.Web项目需要作为整个项目的启动项目(例如:当你使用VS调试功能时)。Orchard.Web动态加载所有Orchard模块并发现模块的扩展(MVC路由,管理页面等等)。
Modules文件夹下的项目在物理文件夹“Ochard.Web\Modules”下。这些模块允许包含ASP.NET视图(.aspx,.ascx和其他文件)和静态内容。
Orchard.Web项目引用的模块,在编译的时候自动将程序集文件复制到Bin目录下。Orchard.Web没有依赖的模块组件。因为在Orchard.Web项目运行的时候不知道有哪些模块会被动态加载。
Modules文件夹下的项目引用了Orchard的项目,这可以让Orchard模块访问Orchard的服务。
关于核心模块
本节讨论一些关于核心模块创建的决策问题。第一个问题是:为什么是核心模块的模块?因为在设计Orchard阶段它被确定为扩展其他模块所必需的核心框架。
例如:Common模块介绍BodyAspect(内容的作者)。一个核心的概念是Common模块可以给其他很多内容类型使用,如:博客文章、页面等等。它可以实现到Orchard框架dll中,让所有模块都依赖于它。但是这就得不到作为一个模块的好处,如能挂接处理器、驱动器、视图、路由等等。这样做也和ASP.NETMVC区域有关,一个区域需要在一个文件夹下。
将核心模块从框架层中分离并独立成一个单独的dll,这是一个正确的观念。这类似一个non-monolithic操作系统。在一个地方实现核心功能,在另一个地方实现系统模块,并提供大量的接口用于扩展更高级的模块。
第二个问题是:为什么是核心模块的核心模块。当它被作为核心模块的概念实现时,它有可被其他模块永久使用。如:评论模块。(评论模块并不是一个核心模块,它可以算是一个基础模块)
需要处理的问题是依赖关系。在Orchard中,模块在Modules目录下可以被禁止和卸载,或通过其他途径更新。Orchard模块应该尽量避免对其他模块的依赖,尽量在后台通过内容部件来定义类型。页面和博客文章分别属于Pages和Blogs模块,并没有引用评论和标签模块,但是它们有可能添加了评论或标签功能到页面和博文文章中。这种分离行为是确保由底层内容类型架构实现,而不是由其他模块间直接引用实现的。
然而,核心模块是Orchard框架的一部分,它可以被所有模块依赖。核心模块将由Orchard开发团队发布,并作为Orchard框架的组成部分。其他模块可以依赖他们,并直接访问其公共外观。