在如何使用Orchard搭建敏捷我的的网站(2)中 介绍了如何使用Orchard,但对于咱们来讲,更重要的是学习Orchard是如何架构的,若是咱们本身编写一个相似应用该如何作。今天有空再次看看 Orchard的其它内容,本篇介绍一下Orchard的一些架构方面的内容。Orchard内容较多,如今还只是了解一些皮毛,还有待进一步学习,放上 来权当随笔记录。html
Orchard构建在已有的一些框架和类库之上,下面是一些主要内容:web
Orchard framework处于Orchard的最底层,你能够把它当作是Orchard的基础类库。shell
public class MvcApplication : HttpApplication {
protected void Application_Start() {
_host = OrchardStarter.CreateHost(MvcSingletons);
_host.Initialize();
}
public static class OrchardStarter {
public static IOrchardHost CreateHost(Action < ContainerBuilder > registrations) {
var container = CreateHostContainer(registrations);
return container.Resolve < IOrchardHost > ();
}
public static IContainer CreateHostContainer(Action < ContainerBuilder > registrations) {
……
builder.RegisterType < DefaultOrchardHost > ().As < IOrchardHost > ().As < IEventHandler > ().SingleInstance();
}
}
public class DefaultOrchardHost : IOrchardHost, IShellSettingsManagerEventHandler, IShellDescriptorManagerEventHandler {
void IOrchardHost.Initialize() {
BuildCurrent();
}
IEnumerable < ShellContext > BuildCurrent() {
if (_current == null ) {
lock (_syncLock) {
if (_current == null ) {
SetupExtensions();
MonitorExtensions();
_current = CreateAndActivate().ToArray();
}
}
}
return _current;
}
IEnumerable < ShellContext > CreateAndActivate() {
var allSettings = _shellSettingsManager.LoadSettings();
if (allSettings.Any()) {
return allSettings.Select(
settings => {
var context = CreateShellContext(settings);
ActivateShell(context);
return context;
});
}
……
}
ShellContext CreateShellContext(ShellSettings settings) {
if (settings.State.CurrentState == TenantState.State.Uninitialized) {
Logger.Debug( " Creating shell context for tenant {0} setup " , settings.Name);
return _shellContextFactory.CreateSetupContext(settings);
}
Logger.Debug( " Creating shell context for tenant {0} " , settings.Name);
return _shellContextFactory.CreateShellContext(settings);
}
}
在Orchard中生成依赖项的标准方法是实现IDependency 或者其继承接口。express
对于依赖有三种可能的范围,具体讲解等待后期分析:缓存
o Request:每次HTTP请求都建立一个新的实例,请求处理有销毁。这种对象实现IDependency
o Object:实现ITransientDependency,实例不共享
o Shell: 实现ISingletonDependency,单例架构
Orchard是构建在ASP.NET MVC 之上的一个框架,可是为了增长主题、多租户等额外功能而也挺入了额外的一些层和概念。例如,当须要一个特定视图时引入LayoutAwareViewEngine。严格的说,这不是一个新的视图引擎,由于它并不关心实际绘制,而只是包含一些查找当前主题下正确视图的一些逻辑功能,而后委托给实际的视图引擎去展示。mvc
Orchard可以处理任意内容类型(content types),内容类型又是由内容Parts组成,例如一个blog、video均可能有地址、回复、tag等,为了重用能够把回复做为一个part存在于一个module中,这样只须要生成一次就好了。app
Parts自己又有本身的属性和内容字段。内容字段(Fields)也是一个重用的概念,它比parts更细粒度,它可使用在多个part中。框架
全部的内容经过ContentManager 对象进行访问,ContentManager有查询内容存储、版本内容和管理发布状态等功能asp.net
Orchard自动为每次HTTP请求生成一个事务
不少在Orchard中能够执行的动做均可以经过命令行形式执行,这些Command都须要实现,命令方法使用CommandName 属性标识
默认使用Lucene 进行索引和查询
基于ASP.NET cache之上的缓存,Orchard缓存API主要好处是对每一个租户的透明性
Orchard的文件系统是抽象概念的,能够是直接的物理文件,也能够是部署在云端的blob storage
Orchard.Core 程序集包含Orchard必须使用到的一些模块,例如feeds、navigation和routable
Orchard默认发布一些内建的模块,例如blog等。一个模块只是一个包含manifest.txt 文件的一个ASP.NET MVC area 文件。
Orchard有一个基本的设计原则,那就是主题的全部HTML均可以被替换。Orchard是基于shapes来展示的,主题引擎的工做就是发现 当前主题,并未当前每个shape找到最佳的展示方式。每个shape能够经过模块的视图目录或者经过代码方式来获取一个默认的展示方式。
推荐:你可能须要的在线电子书