在如何使用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能夠經過模塊的視圖目錄或者經過代碼方式來獲取一個默認的展示方式。
推薦:你可能須要的在線電子書