讓許多網頁系統專案共用某些架構,安全性驗證,Layout...,希望系統維護上能夠更方便
參考文章:
https://blog.longle.net/2012/03/29/building-a-composite-mvc3-application-with-pluggable-areas/
這個網站的範例程式download有點問題,因此就自己試著弄了一個
主要的目的是
讓許多網頁系統專案共用某些架構,安全性驗證,Layout...,系統維護上更方便
新的網頁系統要加在原始的網頁上,就像是熱插拔一樣(當然沒有那麼偉大)
可以把新的網站 Copy 到入口網站的某個目錄,然後就有新的網站
各系統可以自行決定是否要 Share 同一個 _layout View
例如:
我現在有一個網站是 http://myHost/
假如是form驗證 ,沒有權限會從 http://myHost/Account/Logon 進入
新加上一個網站是 http://myHost/WebSite1
如果登入WebSite1 沒有權限,也會從 http://myHost/Account/Logon 進入
在Visual Studio 裡面,網站專案是分開的,因此有一個專案是 myHost,一個專案是 myHost.WebSite1
各自開發各自的,
但是Release的時候,應該是把 myHost.WebSite1 的一些檔案,Copy 到 myHost 就可以執行了
當然整個Solution 專案的切割,應該並不是只有這樣就行了,共用的Library 要怎麼設計Dependency ,那就要看各系統架構的想法了,但善用DI framework 會讓專案之間更獨立,系統會更 maintainable
現在還是先Focus 在要怎麼樣讓網站分開就好了
實作方式:
整個Solution目錄應該類似這樣
step 1
myHost 專案下
需要有一個註冊 Dll 的服務,因此會建立一個pluginAreaBootstrapper的類別來處理這件事情
程式碼如下
這邊主要是,會自動去抓取程式碼設定的目錄,找特定的專案(符合plugIn*.dll) 註冊進來
step2.
要讓myHost 啟動時候,去註冊別的Dll,需要呼叫 PluginAreaBootstrapper.Init
修改myHost 的 AssemblyInfo.cs
增加
[assembly: PreApplicationStartMethod(typeof(PluginAreaBootstrapper), "Init")]
如果IIS的版本有問題
可以在Global.asax application_start 去呼叫
如果要這樣做,請記得在 AreaRegistration.RegisterAllAreas(); 程式碼之前
step3.
在myHost.WebSite1PlugIn的專案
增加一個要註冊Area的class
重點是這個Class 要繼承 AreaRegistration
內容大致如下
這邊主要會註冊一個WebSite1 的AreaRouting ,所有符合這個Routing 就會套用這個專案的Controller
step4.
complier 整個solution 後
1. 在myHost目錄下,建立 Areas 目錄,並在Areas 目錄下建立 WebSite1 目錄
2. 將myHost.WebSite1PlugIn.dll copy 到 myHost Areas的目錄下
3. 將myHost.WebSite1PlugIn Views下所有的檔案Copy 到 myHost\Areas\WebSite1 下
第2.3個步驟,建議設定在專案的Post Build 後,這樣可以減少每次編譯完還要手動搬檔案的動作
最後,執行網站
然後應該就可以看到
http://localhost:???/ 跟 http://localhost:???/WebSite1
如果需要範例可以到 下面連結下載
https://github.com/DevelopZakk/MVCPlugableDemo
這個程式碼範例,還有很多沒有實作,安全性設計沒在上面,sitemap 也沒有規劃,Layout 共用底層的 ........
但應該可以看出效果了
此外,應該還有更複雜但更有彈性的方式,因為MVC Framework ,有很多DI的設計,使用Area 應該是較簡單的方式
Happy Coding!