感慨:當接觸到微軟這套程序時,代碼實在是太好了,好的幾乎都讀不懂。好久以前就對這個套開源程序特別感興趣,但讀不明白也讓人鬱悶。html
可組裝系統的CMS系統,OrChard在運行時能夠加載modules。0.5版本的精髓就是使得組件能夠隨意安裝,拆卸。web
Orchard像任何ASP.NET MVC工程一直,容許使用Visual Studio將模塊編輯成程序集。Orchard也提供一個定製的模塊加載策略,好比,它容許模塊的dll無需部署在網站的bin目錄下。shell
此外Orchard還能夠動態的根據模塊源代碼來編譯模塊。這樣能夠比較靈活的部署dll文件,而且可支持在沒有Visual Studio環境的狀況下隨時編譯所修改的模塊源代碼。這有點相似於ASP.NET的「App_Code」文件夾,只不過Orchard支持更多的這樣的文件夾。編程
Orchard的目的是爲了打形成一個能夠自動裝載的系統架構
不是,以後每次訪問數據都是從內存中獲取的。 mvc
Modules | |||
Core | |||
Orchard Framework | |||
ASP.NET MVC | NHibernate | Autofac | Castle |
.NET | ASP.NET | ||
IIS or Windows Azure |
orchard framework 是Orchard項目的最低層代碼。他包含該項目的引擎部分,至少說,他部分不能被隔離到Moudels層。最靜態的事實是,即便最基本的模塊也不得不依賴他。你能夠把他看做Orchard基礎類庫。app
當一個Orchard web應用程序啓動時,一個Host是一個單利在當前應用程序域級別。框架
下一步,Host將會獲取到Shell,以便當前租戶(tenant)可使用ShellContextFactory.租戶(Tenants)是一個個被隔絕的應用程序(application)實例,就如用戶能夠被告知,可是他們運行在同一個AppDomain應用實例,以便提升站點密度。Shell是一個單利在租戶級別,能夠說是表明租戶。它是一個能夠有效地提供租戶隔離的同時保證對多租戶的組件編程模型無關的對象。asp.net
一旦Shell被建立,將會從ExtensionManager對象中得到到有效的擴展列表,擴展包含Modules,Themes.默認實現是經過掃描modules,themes文件目錄來加載擴展。函數
同時,Shell將從ShellSettingsManager對象中獲取到租戶配置列表。默認實現獲取配置是從適當的AppData子文件中,可是特殊的實現能夠從不一樣的地方獲取。例如,咱們有一個Azure的實現,是使用blob來替代存儲,由於在那個環境下不肯定AppData文件夾是否可寫。
而後,Shell獲取CompositionStrategy對象,並使用它預處理IOC容器,從(當前host的)可擴展列表和(當前租戶Tenant的)配置列表。這樣的結果不是一個shell的IOC容器,它是一個ShellBluePrint對象,ShellBluePrint是一個列表,包依賴,控制器和記錄blueprints.
而後ShellSettings列表(針對每一個租戶)和ShellBluePrint被拋進ShellContainerFactory.CreateContainer方法從而獲取到一個ILifetimeScope返回對象,ILifetimeScope對象基本上使IOC容器做用返回在租戶級別,進而modules(模塊)能夠獲得當前租戶做用範圍內依賴注入,而不用作其餘處理。
大量使用依賴注
如何將Modules塊集成到系統中?
動態的加載~\Modules,還包含~\Core,~\Themes(備註:除了這三個模塊不知道是否還有其餘模塊,但願不要誤導讀者);
概述:當應用程序啓動時加載進來的,在Globalx.ascx的Application_Start()函數中,調用了Starter<IOrchardHost> 的OnApplicationStart(this)時,
經過ExtensionLoaderCoordinator的SetupExtensions函數調用:
CoreExtensionLoader,DynamicExtensionLoader,PrecompiledExtensionLoader,RawExtensionLoader,ReferencedExtesionLoader,
將~\Modules,~\Core,~\Themes下資源文件信息加載到ExtensionLoadingContext對象中,並將ExtensionLoadingContext對象並在ExtensionManager的SetupExtensions函數中信息存儲到內存被你持久化到xml文件中。