Orchard架构介绍

简介:

在如何使用Orchard搭建敏捷个人的网站(2)中 介绍了如何使用Orchard,但对于我们来说,更重要的是学习Orchard是如何架构的,如果我们自己编写一个类似应用该如何做。今天有空再次看看 Orchard的其它内容,本篇介绍一下Orchard的一些架构方面的内容。Orchard内容较多,现在还只是了解一些皮毛,还有待进一步学习,放上 来权当随笔记录。

Architecture

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 Framework

Orchard framework处于Orchard的最底层,你可以把它看成是Orchard的基础类库。

  • Orchard的启动
  1. 当Orchard web应用启动后,生成一个应用域级别的单例的Orchard Host(DefaultOrchardHost)
    View Code
    
         
         
    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();

    }

    }
  2. DefaultOrchardHost负责生成Shell,其中引入了一些类:ShellContextFactory、ExtensionManager、ShellSettingsManager、CompositionStrategy、ShellBlueprint,现在就不细说了,因为我还没有怎么看
View Code

   
   
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);

}

}
  • Dependency injection

在Orchard中生成依赖项的标准方法是实现IDependency 或者其继承接口。

对于依赖有三种可能的范围,具体讲解等待后期分析:

          o Request:每次HTTP请求都创建一个新的实例,请求处理有销毁。这种对象实现IDependency
          o Object:实现ITransientDependency,实例不共享
          o Shell: 实现ISingletonDependency,单例

  • ASP.NET MVC

Orchard是构建在ASP.NET MVC 之上的一个框架,但是为了增加主题、多租户等额外功能而也挺入了额外的一些层和概念。例如,当需要一个特定视图时引入LayoutAwareViewEngine。严格的说,这不是一个新的视图引擎,因为它并不关心实际绘制,而只是包含一些查找当前主题下正确视图的一些逻辑功能,然后委托给实际的视图引擎去展现。

Types, Parts and Fields

Orchard能够处理任意内容类型(content types),内容类型又是由内容Parts组成,例如一个blog、video都可能有地址、回复、tag等,为了重用可以把回复作为一个part存在于一个module中,这样只需要生成一次就行了。

Parts本身又有自己的属性和内容字段。内容字段(Fields)也是一个重用的概念,它比parts更细粒度,它可以使用在多个part中。

Content Manager

所有的内容通过ContentManager 对象进行访问,ContentManager有查询内容存储、版本内容和管理发布状态等功能

Transactions

Orchard自动为每次HTTP请求生成一个事务

Event bus

Commands

很多在Orchard中可以执行的动作都可以通过命令行形式执行,这些Command都需要实现,命令方法使用CommandName 属性标识

Search and indexing

默认使用Lucene 进行索引和查询

Caching

基于ASP.NET cache之上的缓存,Orchard缓存API主要好处是对每个租户的透明性

File systems

Orchard的文件系统是抽象概念的,可以是直接的物理文件,也可以是部署在云端的blob storage

Orchard core

Orchard.Core 程序集包含Orchard必须使用到的一些模块,例如feeds、navigation和routable

Modules

Orchard默认发布一些内建的模块,例如blog等。一个模块只是一个包含manifest.txt 文件的一个ASP.NET MVC area 文件。

Themes

Orchard有一个基本的设计原则,那就是主题的所有HTML都可以被替换。Orchard是基于shapes来展现的,主题引擎的工作就是发现 当前主题,并未当前每一个shape找到最佳的展现方式。每一个shape可以通过模块的视图目录或者通过代码方式来获取一个默认的展现方式。





 本文转自 陈本峰 51CTO博客,原文链接:http://blog.51cto.com/zhoujg/491229,如需转载请自行联系原作者

相关文章
|
3天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
|
云安全 安全 网络安全
|
17天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
4143 1
|
16天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2755 47
|
10天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2068 2
|
9天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。
|
13天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1538 3
|
11天前
|
开发者 索引
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
Open Plugin Market 是一个开放插件索引平台,收录800+优质DSH插件,支持分类浏览、智能推荐与随机发现。无需安装市场,粘贴索引地址即可一键接入,网页版直访 dshopen.org,助力小开发者被看见。(239字)
2158 1
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用