Orchard架构介绍
在如何使用Orchard搭建敏捷個(gè)人的網(wǎng)站(2)中 介紹了如何使用Orchard,但對(duì)于我們來(lái)說(shuō),更重要的是學(xué)習(xí)Orchard是如何架構(gòu)的,如果我們自己編寫(xiě)一個(gè)類(lèi)似應(yīng)用該如何做。今天有空再次看看 Orchard的其它內(nèi)容,本篇介紹一下Orchard的一些架構(gòu)方面的內(nèi)容。Orchard內(nèi)容較多,現(xiàn)在還只是了解一些皮毛,還有待進(jìn)一步學(xué)習(xí),放上 來(lái)權(quán)當(dāng)隨筆記錄。
Architecture
Orchard foundations
Orchard構(gòu)建在已有的一些框架和類(lèi)庫(kù)之上,下面是一些主要內(nèi)容:
- ASP.NET MVC:這是微軟開(kāi)源的基于MVC的Web開(kāi)發(fā)框架
- NHibernate:NHibernate 是一個(gè)ORM工具,從Hibernate演化而來(lái)
- Autofac: 一個(gè)IoC container。Orchard大量使用依賴(lài)注入
- Castle Dynamic Proxy: Castle 是.Net中很早就出現(xiàn)的一個(gè)開(kāi)源項(xiàng)目,Castle Dynamic Proxy是一個(gè)生產(chǎn)動(dòng)態(tài)代理的東東
Orchard Framework
Orchard framework處于Orchard的最底層,你可以把它看成是Orchard的基礎(chǔ)類(lèi)庫(kù)。
- Orchard的啟動(dòng)
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();
}
}
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中生成依賴(lài)項(xiàng)的標(biāo)準(zhǔn)方法是實(shí)現(xiàn)IDependency 或者其繼承接口。
對(duì)于依賴(lài)有三種可能的范圍,具體講解等待后期分析:
????????? o Request:每次HTTP請(qǐng)求都創(chuàng)建一個(gè)新的實(shí)例,請(qǐng)求處理有銷(xiāo)毀。這種對(duì)象實(shí)現(xiàn)IDependency
????????? o Object:實(shí)現(xiàn)ITransientDependency,實(shí)例不共享
????????? o Shell: 實(shí)現(xiàn)ISingletonDependency,單例
- ASP.NET MVC
Orchard是構(gòu)建在ASP.NET MVC 之上的一個(gè)框架,但是為了增加主題、多租戶(hù)等額外功能而也挺入了額外的一些層和概念。例如,當(dāng)需要一個(gè)特定視圖時(shí)引入LayoutAwareViewEngine。嚴(yán)格的說(shuō),這不是一個(gè)新的視圖引擎,因?yàn)樗⒉魂P(guān)心實(shí)際繪制,而只是包含一些查找當(dāng)前主題下正確視圖的一些邏輯功能,然后委托給實(shí)際的視圖引擎去展現(xiàn)。
Types, Parts and Fields
Orchard能夠處理任意內(nèi)容類(lèi)型(content types),內(nèi)容類(lèi)型又是由內(nèi)容Parts組成,例如一個(gè)blog、video都可能有地址、回復(fù)、tag等,為了重用可以把回復(fù)作為一個(gè)part存在于一個(gè)module中,這樣只需要生成一次就行了。
Parts本身又有自己的屬性和內(nèi)容字段。內(nèi)容字段(Fields)也是一個(gè)重用的概念,它比parts更細(xì)粒度,它可以使用在多個(gè)part中。
Content Manager
所有的內(nèi)容通過(guò)ContentManager 對(duì)象進(jìn)行訪(fǎng)問(wèn),ContentManager有查詢(xún)內(nèi)容存儲(chǔ)、版本內(nèi)容和管理發(fā)布狀態(tài)等功能
Transactions
Orchard自動(dòng)為每次HTTP請(qǐng)求生成一個(gè)事務(wù)
Event bus
Commands
很多在Orchard中可以執(zhí)行的動(dòng)作都可以通過(guò)命令行形式執(zhí)行,這些Command都需要實(shí)現(xiàn),命令方法使用CommandName 屬性標(biāo)識(shí)
Search and indexing
默認(rèn)使用Lucene 進(jìn)行索引和查詢(xún)
Caching
基于ASP.NET cache之上的緩存,Orchard緩存API主要好處是對(duì)每個(gè)租戶(hù)的透明性
File systems
Orchard的文件系統(tǒng)是抽象概念的,可以是直接的物理文件,也可以是部署在云端的blob storage
Orchard core
Orchard.Core 程序集包含Orchard必須使用到的一些模塊,例如feeds、navigation和routable
Modules
Orchard默認(rèn)發(fā)布一些內(nèi)建的模塊,例如blog等。一個(gè)模塊只是一個(gè)包含manifest.txt 文件的一個(gè)ASP.NET MVC area 文件。
Themes
Orchard有一個(gè)基本的設(shè)計(jì)原則,那就是主題的所有HTML都可以被替換。Orchard是基于shapes來(lái)展現(xiàn)的,主題引擎的工作就是發(fā)現(xiàn) 當(dāng)前主題,并未當(dāng)前每一個(gè)shape找到最佳的展現(xiàn)方式。每一個(gè)shape可以通過(guò)模塊的視圖目錄或者通過(guò)代碼方式來(lái)獲取一個(gè)默認(rèn)的展現(xiàn)方式。
參考:How Orchard Works
推薦:你可能需要的在線(xiàn)電子書(shū)?
我的新浪圍脖: http://t.sina.com.cn/openexpressapp
轉(zhuǎn)載于:https://blog.51cto.com/zhoujg/491229
總結(jié)
以上是生活随笔為你收集整理的Orchard架构介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SC/Tetra.v7-ISO 1DVD
- 下一篇: 个人应用开发详记. (三)