2011-06-19 34 views
0

我目前正在研究一個半大型MVC 2項目,我們擁有的關聯視圖和視圖模型的控制器數量正在變得非常大。爲了嘗試並提供一些分離,我一直在研究使用MVC 2的區域特徵並相應地重構項目。在控制器的每個區域設置多個區域,繼承自一個基礎控制器 - MVC

我面對的問題之一是我們對控制器有一個繼承層次,以便共享我們在具體控制器中使用的功能和屬性,然後公開我們希望處理的必要操作。

本質上講,我們現在有一個設置像這樣在我們的主控制器文件夾:

Controller (MVC) 
+-- BaseController (Abstract) 
     +-- BaseWorkController (Abstract) 
      +-- BaseWorkAController (Abstract) 
       +-- ... a number of controllers exposing actions 
      +-- BaseWorkBControllers (Abstract) 
       +-- ... a number of controllers exposing actions 

我每個工作控制器思維創造地區即

  • 區/ WorkA
  • 區/ WorkB

每個區域都有其關聯的視圖和視圖模型甚至模型。

但是,我似乎面臨的問題是我在哪裏放置BaseWorkController。可以將它保留在主控制器文件夾中,並且區域控制器只包含對該控制器的引用。另外,不同區域的代碼可能需要訪問不同的模型,甚至需要爲某些功能創建一些屬性。

這個設置看起來像是可以接受的區域使用。從我讀過的東西看來,這些東西似乎有助於我正在尋找的關注點和功能。但是,如果這是對功能的完全錯誤使用,我不想投資這麼做。

控制器代碼是否可以使用來自其他區域或主要核心控制器/模型/視圖文件夾的功能。

回答

2

您的應用程序中的繼承數量對我來說是一個警告。如果你有那麼多的共享行爲,我認爲你應該考慮把它從控制器本身中拉出來,並創建一些封裝共享邏輯的類,然後你可以通過組合來擴展控制器的功能,而不是繼承。

要回答您的問題,從基礎控制器到其他區域的控制器共享邏輯沒有任何問題。如果這樣做是有道理的。但是如果你開始在繼承鏈中深入幾層,我會強烈考慮檢查代碼,看看共享邏輯是否可以在不同的共享類中有意義,而不是用多重覆蓋來使事情複雜化。

如果您重寫不同級別的行爲,您可能需要查看策略模式。您可以使用該模式交換組件的行爲並使用組合,而不是繼承。

+0

我承認樹很深。許多功能是繼承控制器根據需要使用的附加方法,通常是受保護的方法。他們不是特別大,特別是BaseWorkAControllers等我不確定我們如何重構這個,但我可能能夠擺脫這個水平,所以我會看看建議的模式。謝謝。 – dreza