开发一个CMS(内容管理系统)程序,与开发一个普通的应用程序很大情况下是不同的,CMS程序更像是一个应用程序的管理器系统。当我们在设计这个系统的时候,第一考虑的是它的扩展性,这是一个非常有挑战的开放式架构。这些扩展性可能会影响系统的可用性,这些扩展需要与系统中未知的模块作良好的兼容,包括达到与用户界面级别,架构组织好这些各自不同的模块彼此运行在一起,这就是Orchard的全部。 
这篇文章介绍了Orchard如何解决以上典型的问题灵活性和良好的用户体验。

Orchard架构图

基础与依赖

Orchard CMS是建立在现有的框架和类库基础之上,它们分别是:

  • ASP.NET MVC:ASP.NET MVC是现在最流行的Web开发框架之一, 鼓励关注点分离;
  • NHibernate:NHibernate是一个对象-关系映射工具。它处理了Orchard内容项数据库持久化,大大地简化了我们所关心的数据模型等操作,你可以从我们的源码中看到这样的例子,例如页面类。
  • Autocac:Autofac是一个IoC容器,Orchard大量使用了依赖注入。创建一个依赖注入非常简单,就像创建一个类一样,只要直接或者间接实现或者标记了IDependency接口,采用实现正确的构造方法参数。而后所有注入的范围和生命周期都交给Orchard来完成,你可以从代码中看到这样的例子,像IAuthorizationService接口。
  • Castle Dynamic Proxy:我们使用Castle为作为动态代理工具。

Orchard应用和框架是建立在这些基础框架的额外的抽象层,在实现的各个方面与NHibernate、Castle、Autofac一起运行起来。

 

Orchard Framework

从Orchard架构图中可以看出,Orchard Framework是最底层库,包含了应用程序引擎或者不可缺的模块,甚至于最小的一部分模块都不得不依赖于它,你可以理解这是Orchard最基础的类型。


 

工作程序

当Orchard运行起来,一个Orchard Host就会被创建,host是独立于应用程序域级别的一个东西。

接下来,这个host就会从当前的子站点(tenant)取得Shell去使用ShellContextFactory,这些租群(tenants)是独立于用户的应用程序实例,运行于同一个应用域,主要是为提高站点的密度。shell是一个单例的租户级别,事实上也可以代表租户。这将会有效地提供租户-级别的隔离,即保持了模块程序与多租户信息不可知的某种关联。

这个shell,一旦被创建就会从ExtensionManager获取有效的扩展信息,这些扩展包含了模块(modules)和主题(themes),默认会自动扫描modules和themes文件夹里的扩展。

与此同时,租户会从ShellSettingsManager取得一系统的设置信息给shell,默认实现了从适当的子文件夹app_data或者安装时实现的位置获取。例如,Azure实现了从云端存储而替代app_data文件环境获取。

然后shell获取所有的有效的信息物件后使用它来准备IoC容器,注入可用的扩展列表和当前的host,当前的子站点。最终形成这个一系列的依赖图,控制器和记录列表在内。

这个一系列的shell设置(也就是每一个租户)和这些一系列依赖图通过ShellContainerFactory.CreateContainer得到一个ILifetimeScope,这基本上是租户IoC包涵的范围了,至此这些modules被注入了当前租户范围信息,但modules并没有做实现具体的事情。

依赖注入

实现一个标准的依赖注入方式是直接或者间接实现IDependency接口,在另一面实现一个带参的构造函数。应用框架会找出所有的依赖,并且会根据需要实例化和注入实例。

依赖关系有三种不同的可能范围,选择其中一个去实现正确的接口:

  • Request:每一个新的Http请求和在请求被摧毁的处理时依赖实例都会被创建,从IDependency接口派生出来对象创建都是非常安全可靠的并且成本很低。
  • Object:每次都创建一个实例对象接口,实例不被共享。使用这个从ITransientDependency派生出来的。创建的对象必须是非常便宜的。
  • Shell:每个whell/tenant只能创建一个实例,使用从ISingletonDependency创建对象,shell必须保持一个共同的生命状态。
 

替换存在中的依赖

可以取代现有的依赖,如果一个类被OrchardSuppressDependency装饰您的类特性,但这需要完全限定类型名称来取代作为参数。

 

依赖的排序

一些依赖关系并不是唯一的,而且部分列表。例如,有同一时间的一些处理程序被激活时,在某一些情况下你想修改一些依赖的顺序,这可以通过修改模块的清单里优先属性,例如下面这个:

 
Features:
Orchard.Widgets.PageLayerHinting:
Name: Page Layer Hinting
Description: ...
Dependencies: Orchard.Widgets
Category: Widget
Priority: -

官网地址:http://docs.orchardproject.net/Documentation/How-Orchard-works

第一次做翻译,英文太差,请见谅。未完。

Orchard-官方文档翻译1 Orchard的工作方式的更多相关文章

  1. Orchard官方文档翻译(四) 让Orchard在WebMatrix下工作

    原文地址:http://docs.orchardproject.net/Documentation/Working-with-Orchard-in-WebMatrix 想要查看文档目录请用力点击这里 ...

  2. Orchard官方文档翻译(六) 建立你的第一个Orchartd站点

    让我们开始 该主题内容已在Orchard1.8Release版本下测试通过. 这里通过向导式的教程来告诉大家Orchard的功能如何使用.如果你是第一次使用Orchard,该文档就是为你而准备的! O ...

  3. Orchard官方文档翻译(二) 安装 Orchard

    原文地址:http://docs.orchardproject.net/Documentation/Installing-Orchard 想要查看文档目录请用力点击这里 最近想要学习了解orchard ...

  4. Orchard官方文档翻译(一) 总览

    原文地址:http://docs.orchardproject.net/ 最近想要学习了解orchard,但却没有找到相关的中文文档,只有英文文档.于是决定自行翻译,以便日后方便翻阅. 转载请注明原作 ...

  5. Orchard官方文档翻译(三) 通过zip文件手动安装Orchard

    原文地址:http://docs.orchardproject.net/Documentation/Manually-installing-Orchard-zip-file 想要查看文档目录请用力点击 ...

  6. Orchard官方文档翻译(九) 新增并管理媒体资源

    原文地址:http://docs.orchardproject.net/Documentation/Adding-and-managing-media-content 想要查看文档目录请用力点击这里 ...

  7. Orchard官方文档翻译(七) 导航与菜单

    原文地址:http://docs.orchardproject.net/Documentation/Navigation-and-menus 想要查看文档目录请用力点击这里 最近想要学习了解orcha ...

  8. Orchard官方文档翻译(十一) 使用Tags组织文本

    原文地址:http://docs.orchardproject.net/Documentation/Organizing-content-with-tags 想要查看文档目录请用力点击这里 最近想要学 ...

  9. Orchard官方文档翻译(十) 管理Widgets

    原文地址:http://docs.orchardproject.net/Documentation/Managing-widgets 想要查看文档目录请用力点击这里 最近想要学习了解orchard,但 ...

  10. Orchard官方文档翻译(八) 为站点增加博客

    原文地址:http://docs.orchardproject.net/Documentation/Adding-a-blog-to-your-site 想要查看文档目录请用力点击这里 最近想要学习了 ...

随机推荐

  1. 使用lua实现99乘法口诀表,就这么简洁

    for i=1,9 do for j=1,i do io.write(j,"*",i,"=",i*j," ") end print() en ...

  2. 关于linux 共享内存查看已经完整释放

    完整删除共享内存脚本 #!/bin/sh function rmshm() { zero_status=`ipcs -m|awk '{print $6}'|grep -w 0|wc -l` if [ ...

  3. vim撤销与反撤销

    按esc进入一般模式之后,u按键则为撤销上一步操作,ctrl+r则为反撤销操作

  4. matlab中如何用rand产生相同的随机数

    直接给链接:rand()产生相同随机数

  5. 代码中设置color的selector

    //应该用getColorStateList这种方式 xml中设置时直接color引用就可以了 textView.setTextColor(getResources().getColorStateLi ...

  6. 20175120彭宇辰 《Java程序设计》第六周学习总结

    教材学习内容总结 第七章 一.内部类与外部类的关系 1.内部类可以使用外嵌类的成员变量和方法.2.类体中不可以声明类变量和类方法,外部类可以用内部类声明对象.3.内部类仅供外嵌类使用.4.类声明可以使 ...

  7. Spring EnableWebMvc vs WebMvcConfigurationSupport

    EnableWebMvc vs WebMvcConfigurationSupport spring doc解释 WebMvcConfigurationSupport: This is the main ...

  8. CentOS 7安全加固

    本次实验使用的centos 7 版本 一.查找系统中是否存在空密码账户 1.使用命令: awk -F: '($2==""){print $1}' /etc/shadow 直接查看. ...

  9. 个性化自己的DOS窗口

    就是为了好看吧,感觉没啥大用 ============= 首先创建一个文本,写下如下命令 @echo off color D echo ======================== echo == ...

  10. STL标准模板类

    STL,中文名标准模板库,是一套C++的标准模板类(是类!),包含一些模板类和函数,提供常用的算法和数据结构. STL分为:迭代器,容器,适配器,算法以及函数对象. --迭代器是一种检查容器内元素并遍 ...