製作 Plugable 網頁系統 -利用 MVC Area

  • 279
  • 0
  • MVC
  • 2016-05-25

讓許多網頁系統專案共用某些架構,安全性驗證,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!