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的啟動
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中生成依賴項的標準方法是實現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可以通過模塊的視圖目錄或者通過代碼方式來獲取一個默認的展現方式。
參考:How Orchard Works
推薦:你可能需要的在線電子書?
我的新浪圍脖: http://t.sina.com.cn/openexpressapp
轉載于:https://blog.51cto.com/zhoujg/491229
總結
以上是生活随笔為你收集整理的Orchard架构介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SC/Tetra.v7-ISO 1DVD
- 下一篇: 如何使用 Microsoft Azure