开发一个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. Windows Server 2008系统

    Windows Server 2008特点 1,可操作性 2,可管理性 3,可扩展性 4,可用性 5,安全性 Windows Server 2008提供两个最常用默认用户账户Administrator ...

  2. Jira7.10.1在Windows环境下的安装和配置

    jira安装的环境准备   1.   jira7.10的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本: Java -version   2.  还需要为jira创建对应的数据 ...

  3. 浏览器兼容性汇总--CSS篇

    目录 CSS篇 1.       cursor:hand   VS   cursor:pointer 2.        innerText在IE中能正常工作,但在FireFox中却不行 3.     ...

  4. PostgreSQL注入基础

    一般注入多用于在mssql和mysql两类数据库中,如mssql+asp.mysql+php则是最为常见的搭配环境.不同的网站应用的数据库也大不一样,根据数据库的处理能力.负载等多重因素决定.本文主要 ...

  5. servlet之小demo(四)

    描述: 1.在web.xml文件中设置两个web应用的初始化参数,user和password 2.定义一个login.html,里面定义两个请求字段:user,password,发送请求到loginS ...

  6. Tecplot: Legend和图像中 Dashed/Dash dot/Long dash 等虚线显示没有区别的问题

    问题描述:如下图1中线型明明选择的不同,但是tecplot里显示的图像和legend里显示的线型没有区别,应该是bug. tecplot 版本:360EX  2017R2 解决办法:把Pattern ...

  7. storm入门基础实例(无可靠性保证实例)

    本实例为入门篇无可靠性保证实例,关于storm的介绍,以及一些术语名词等,可以参考Storm介绍(一).Storm介绍(二). 本案例是基于storm0.9.3版本 1.案例结构 案例:Word Co ...

  8. 【EMV L2】Cardholder Verification Rule(CVR) Format

    Cardholder Verification Rule(CVR)由两个字节组成: 高字节为Cardholder Verification Method (CVM) Codes,表示执行Cardhol ...

  9. redis服务问题解决办法

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.ps aux|grep redis部署虚拟机失败,代码中添加任 ...

  10. Linux中(Ubuntu18.04.x/CentOS)mysql8.0.x安装/配置/部署/启动

    The MySQL Connectors and APIs are the drivers and libraries that you use to connect applications in ...