之前文章中給大家說明了下我這個小小的想法,發現還是有不少人的支持和關注。你們的鼓勵是對我最大的支持。
我總結了了大家的評論,有以下幾個問題:
1.希望有更多的文檔說明。
2.希望介紹下Orchard的熱插拔機制。
3.希望可以說明如何擴展功能什么的。
4.介紹下Orchard的核心機制。
5. 介紹下我對Orchard的整個瘦身過程怎么做的。
6.覺得這個像瑞星殺毒只剩下小獅子了(這個有意思 J)
除了這些還有別的,我只是自己大概總結了下。
對於以上的問題,我不會挨個去說明。只是給大家說明下我的整個計划和接下來的安排。
首先,文檔是必須的。可能在博客上未來不會有太多的文檔,但是在github上你將會找到很多的說明文檔。OrchardCMS的整個運作機制,確實是很龐大,很復雜的。對於大家都關注和好奇的熱插拔,我不可能一下子就去介紹說明它,因為它依賴於Orchard CMS的其他好多功能和機制。比如:Shell的概念,Feature的加載機制,緩存機制,動態代理、HttpContent管理等。還有一些協調的方法類等。
從我接觸OrchardCMS開始到現在也有兩年了。開始試着去讀它的源碼,有點不靠譜,或者說對能力的要求比較高。所以試着從模塊開發為出發點,慢慢的滲透,理解才是比較適合我們大多數人的方法。
所以還是從比較簡單的模塊開發來,中間會順帶的介紹一些OrchardCMS中的比較核心的內容。
1. 創建一個模塊:
我保留了代碼生成模塊,不能通過手動創建模塊,那樣會瘋掉的。所以首先需要去Tools文件夾下的Orchard/bin下把Orchard.exe拷貝到Web站點的bin目錄下。
然后打開它,建議使用Powershell打開,容易粘貼復制。
使用codegen module Orchard.Car來生成一個Orchard.Car模塊。
如果你使用過改模塊,那么忽略這一節,往下看吧。
打開解決方案,在Modules文件夾下,右鍵選擇‘添加’菜單,找到Orchard.Web文件夾下的Modules文件夾,選擇剛才生成好的Orchard.Car。
添加完成后,我們就創建好了Orchard.Car模塊。
2. 修改module.txt文件。
對於一個模塊,這里需要理解什么是模塊邊界,就是這個模塊能夠放到容器里的所有觸頭。
OrchardNoCMS中一個模塊的觸頭有以下幾個:
也就是該模塊必須有的部分。所以我們需要修改Module.txt文件,來確定模塊以來的OrchardNoCMS版本號,以及模塊的版本號。修改后的文檔如下:
3. 創建Car的實體和關系映射。
現在我們需要的是車輛這個實體,包含名稱、描述、價格、品牌、座位數幾個屬性。
對應的實體和數據庫中表的關系映射,OrchardNoCMS會自己來完成。所以我們只是定義實體。

這里說明下Orchard是如何來找到需要創建映射關系的實體類。
首先需要關注的是CompositionStrategy 這個類。
看看它都干了什么。J。它通過找到命名空間以.Models結束的並且包含屬性有Id這個字段的類作為需要創建mapping的實體。然后通過創建RecordBlueprint來告訴NHibernate你應該讓哪個類映射到哪張表。
但是默認這里有很大的局限性。
比如:我的主鍵不想叫Id,我想叫tablename+Id,那怎么辦呢?我的表名比較特殊,不能和類同名怎么辦?不着急,后面會說明。
最終的實體關系映射會存放到APPData /site下某處,名字叫mapping.bin,你可以自己去找找看。
4. 創建Service
有了實體,接下來需要做的是創建一個Service。注意,如果你使用OrchardCMS,那么可以看到里面的數據庫操作大都離不開內容管理。這里則直接是使用IRepository進行數據庫操作。所以我們需要創建一個ICarInfoService接口,並實現它。
上圖中圈住的IDependency這個 接口,是所有需要自動注入到Autofac容器的接口都需要繼承的。
這里就需要說明一下Orchard的底層自動注入機制。看ShellContainerFactory.cs中的代碼來完成所有的自動注入功能,同時它還結合Castle.DynamicProxy實現了AOP功能。所以大致來說,大部分的面向對象牛X的框架都離不開IoC和它上面的AOP。
對於不同的注入方式和AOP在別的文章里介紹吧。
5. 創建Controller和View
創建好實體后,我們創建一個新增記錄的Action。
創建好對應的View,需要注意的是,這里Views文件夾下的子文件夾需要自己手動創建。
Index.cshtml為空,先不創建。本人的css不是很好,所以隨便寫了幾個div。
6. 創建路由
如果不創建路由,也可以通過Orchard.car/Car/Add來訪問上面創建的Action,但是我們為了簡單,可以自己定義路由,所有自定義的路由都需要實現IRouteProvider這個接口。
現在就可以通過car/add來訪問上面定義好的Action啦。
7. 創建數據庫表
使用Orchard提供的DataMigration來創建表。方法如下:
8. 啟用模塊。
在剛才打開的orchard.exe中執行如下命令: feature enable orchard.car
以上完成模塊的開發。
以上只是理想的狀態。現實總是有很多變態的需求。也希望大家提出自己的問題。
待續。。。。。。。。。。。。。。














