Orchard学习系列-----如何运行的
感慨:当接触到微软这套程序时,代码实在是太好了,好的几乎都读不懂。很久之前就对这个套开源程序特别感兴趣,但读不明白也让人郁闷。
- 背景(Orchard官网):
可组装系统的CMS系统,OrChard在运行时可以加载modules。0.5版本的精髓就是使得组件可以随意安装,拆卸。
Orchard像任何ASP.NET MVC工程一直,允许使用Visual Studio将模块编辑成程序集。Orchard也提供一个定制的模块加载策略,比如,它允许模块的dll无需部署在网站的bin目录下。
此外Orchard还可以动态的根据模块源代码来编译模块。这样可以比较灵活的部署dll文件,并且可支持在没有Visual Studio环境的情况下随时编译所修改的模块源代码。这有点类似于ASP.NET的“App_Code”文件夹,只不过Orchard支持更多的这样的文件夹。
Orchard的目的是为了打造成一个可以自动装载的系统
- 是不是每次程序运行都会动态加载?
不是,之后每次访问数据都是从内存中获取的。
- 架构结构:
| Modules | |||
| Core | |||
| Orchard Framework | |||
| ASP.NET MVC | NHibernate | Autofac | Castle |
| .NET | ASP.NET | ||
| IIS or Windows Azure | |||
- Orchard Foundations:
- Orchard构建在已有的一些框架和类库之上,下面是一些主要内容:
- ASP.NET MVC:这是微软开源的基于MVC的Web开发框架
- NHibernate:NHibernate 是一个ORM工具,从Hibernate演化而来
- Autofac: 一个IoC container。Orchard大量使用依赖注入
- Castle Dynamic Proxy: Castle 是.Net中很早就出现的一个开源项目,Castle Dynamic Proxy是一个生产动态代理的东东.
- Orchard构建在已有的一些框架和类库之上,下面是一些主要内容:
- Orchard Framework:
orchard framework 是Orchard项目的最低层代码。他包含该项目的引擎部分,至少说,他部分不能被隔离到Moudels层。最静态的事实是,即使最基本的模块也不得不依赖他。你可以把他看作Orchard基础类库。
- 启动Orchard
当一个Orchard web应用程序启动时,一个Host是一个单利在当前应用程序域级别。
下一步,Host将会获取到Shell,以便当前租户(tenant)可以使用ShellContextFactory.租户(Tenants)是一个个被隔绝的应用程序(application)实例,就如用户可以被告知,但是他们运行在同一个AppDomain应用实例,以便提高站点密度。Shell是一个单利在租户级别,可以说是代表租户。它是一个可以有效地提供租户隔离的同时保证对多租户的组件编程模型无关的对象。
一旦Shell被创建,将会从ExtensionManager对象中获得到有效的扩展列表,扩展包含Modules,Themes.默认实现是通过扫描modules,themes文件目录来加载扩展。
同时,Shell将从ShellSettingsManager对象中获取到租户配置列表。默认实现获取配置是从适当的AppData子文件中,但是特殊的实现可以从不同的地方获取。例如,我们有一个Azure的实现,是使用blob来替代存储,因为在那个环境下不确定AppData文件夹是否可写。
然后,Shell获取CompositionStrategy对象,并使用它预处理IOC容器,从(当前host的)可扩展列表和(当前租户Tenant的)配置列表。这样的结果不是一个shell的IOC容器,它是一个ShellBluePrint对象,ShellBluePrint是一个列表,包依赖,控制器和记录blueprints.
然后ShellSettings列表(针对每个租户)和ShellBluePrint被抛进ShellContainerFactory.CreateContainer方法从而获取到一个ILifetimeScope返回对象,ILifetimeScope对象基本上使IOC容器作用返回在租户级别,进而modules(模块)可以得到当前租户作用范围内依赖注入,而不用做其他处理。
- as
大量使用依赖注
如何将Modules块集成到系统中?
动态的加载~\Modules,还包含~\Core,~\Themes(备注:除了这三个模块不知道是否还有其他模块,希望不要误导读者);
- 什么时候动态加载这些模块?
概述:当应用程序启动时加载进来的,在Globalx.ascx的Application_Start()函数中,调用了Starter<IOrchardHost> 的OnApplicationStart(this)时,
通过ExtensionLoaderCoordinator的SetupExtensions函数调用:
CoreExtensionLoader,DynamicExtensionLoader,PrecompiledExtensionLoader,RawExtensionLoader,ReferencedExtesionLoader,
将~\Modules,~\Core,~\Themes下资源文件信息加载到ExtensionLoadingContext对象中,并将ExtensionLoadingContext对象并在ExtensionManager的SetupExtensions函数中信息存储到内存被你持久化到xml文件中。
Orchard学习系列-----如何运行的的更多相关文章
- Caffe学习系列(22):caffe图形化操作工具digits运行实例
上接:Caffe学习系列(21):caffe图形化操作工具digits的安装与运行 经过前面的操作,我们就把数据准备好了. 一.训练一个model 右击右边Models模块的” Images" ...
- Caffe学习系列(21):caffe图形化操作工具digits的安装与运行
经过前面一系列的学习,我们基本上学会了如何在linux下运行caffe程序,也学会了如何用python接口进行数据及参数的可视化. 如果还没有学会的,请自行细细阅读: caffe学习系列:http:/ ...
- 快速体验Spring Boot了解使用、运行和打包 | SpringBoot 2.7.2学习系列
SpringBoot 2.7.2 学习系列,本节内容快速体验Spring Boot,带大家了解它的基本使用.运行和打包. Spring Boot 基于 Spring 框架,底层离不开 IoC.AoP ...
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- MVC学习系列4--@helper辅助方法和用户自定义HTML方法
在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...
- RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...
- MVC学习系列14--Bundling And Minification【捆绑和压缩】--翻译国外大牛的文章
这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你 ...
- 开篇:软件项目的整个流程 - IT软件人员学习系列文章
这段时间闲来无事,就在总结以前的项目经验,然后写成博客的形式以进行记录.本文就对<IT软件人员学习系列文章>做个开篇吧. 对于IT软件的开发来说,无外乎B/S.C/S和Android.iO ...
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
随机推荐
- PHP Console工具使用分享
PHP Console工具使用分享 http://www.open-open.com/lib/view/open1416193590414.html 您的评价: 不错 收藏该经验 ...
- PHP 常用函数库和一些实用小技巧
PHP 常用函数库和一些实用小技巧 作者: 字体:[增加 减小] 类型:转载 包括文件读取函式,文件写入函式,静态页面生成函式,目录删除函式等 文件读取函式 //文件读取函式 function ...
- CentOS安装TortoiseSVN svn 客户端
CentOS安装TortoiseSVN svn 客户端 一.CentOS安装TortoiseSVN yum install -y subversion 二.SVN客户端命令 1.查看帮助 命令:s ...
- Centos下安装Scrapy
Scrapy是一个开源的机遇twisted框架的python的单机爬虫,该爬虫实际上包含大多数网页抓取的工具包,用于爬虫下载端以及抽取端. 安装环境: centos5.4 python2.7.3 安装 ...
- CentOS安装JAVA后JAVA版本不对的问题
今天用CentOS安装JDK,发觉在安装完成后,输入java命令来验证是否安装成功时,出现 Usage: gij [OPTION] ... CLASS [ARGS] ... to i ...
- 策略模式代替大量的if else
原代码 public class Example { public Double calRecharge(Double charge, RechargeTypeEnum type) { if (typ ...
- android imageButton 点击按钮前中后,按钮颜色的变化
我们在开发的过程中,往往为了美化界面的需要,会修改按钮的默认外观,而因为Android中的按钮有三种状态—默认,被点击,被选中.所以,如果要改变按钮的外观,需要对这三种情况都做出修改,也许在以往,我们 ...
- php数据访问:pdo用法、事物回滚功能和放sql注入功能
PDO: 一.含义: 数据访问抽象层 二.作用 通过PDO能够访问其它的数据库 三. 用法: 1.造对象 ① $pdo ...
- 答CsdnBlogger问-关于安卓入行和开发问题
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 问1:请问大牛对功能和框架的认识有哪些?(提问者:执笔记忆的空白) 比如对于一个小公司来说,什么样的 ...
- ADO.NET中主要对象
ADO.NET是什么? ADO.NET是.Net平台提供和数据库交互的类库集,我们可以通过它对SQLSERVER,XML,Oracle等这样的数据源进行访问. 应用程序可以使用ADO.NET链接到数据 ...