2008-10-24 41 views
91

Derik惠特克發佈了一個article幾天前襲擊,我一直好奇一段時間點的:應業務邏輯控制器存在?ASP.NET MVC - 業務邏輯是否應該存在於控制器中?

到目前爲止,所有的ASP.NET MVC演示我見過控制器把倉庫的訪問和業務邏輯。有些人甚至會在那裏進行驗證。這導致相當大,臃腫的控制器。這真的是使用MVC框架的方式嗎?看起來,這隻會導致很多重複的代碼和邏輯遍佈不同的控制器。

+0

該文章的鏈接已死亡 - http://web.archive.org/web/20150906064521/http://devlicio.us/blogs/derik_whittaker/archive/2008/10/22/how-is-interacting -with-your-data-repository-in-your-controller-different-or-better-doing-doing-your-code-behind.aspx是archive.org的副本,供任何感興趣的人使用。 – 2017-05-22 10:07:04

回答

74

業務邏輯應該真的在模型中。你應該瞄準肥胖模型,瘦骨controllers controllers的控制器。

。例如,而不是:

public interface IOrderService{ 
    int CalculateTotal(Order order); 
} 

我寧願有:

public class Order{ 
    int CalculateTotal(ITaxService service){...}   
} 

這假定稅是由外部服務計算,需要你的模型瞭解界面您的外部服務。

這將使你的控制器看起來是這樣的:

public class OrdersController{ 
    public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...} 

    public void Show(int id){ 
     ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService); 
    } 
} 

或類似的東西。

+1

那麼你會注入服務到您的控制器而不是存儲庫嗎?在這種情況下,工作單位原則如何發揮作用? – 2008-10-24 21:01:24

+0

我寫了更多的東西,我希望這更有意義。 你可能想也看過: http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model 儘管這是Rails的它仍然是非常適用的。 – jonnii 2008-10-24 21:12:11

+0

我會親自調用一個倉庫服務。 – 2008-10-25 00:49:21

14

這是一個有趣的問題。

我認爲它有趣的是,大量的樣品MVC應用程序實際上無法按照真正放置「商業邏輯」完全在模型意義上的MVC模式。馬丁福勒指出,MVC不是四人幫的意義上的模式。相反,如果程序員在玩具應用程序之外創建某種東西,則必須將添加到,這是範例。因此,簡短的回答是,「業務邏輯」實際上不應該存在於控制器中,因爲控制器具有處理視圖和用戶交互的附加功能,並且我們希望僅以一個目的創建對象。

較長的答案是,你需要把一些思想到您的模型層的設計剛剛從控制器移動邏輯模型前。也許你可以使用REST處理所有的應用邏輯,在這種情況下,模型的設計應該相當清晰。如果沒有,你應該知道你要用什麼方法來防止模型變得臃腫。

14

您可以檢查由斯蒂芬·瓦爾特這真棒教程,顯示Validating with a Service Layer

瞭解如何將您的驗證 邏輯移出控制器動作 ,併成爲一個單獨的服務層。在 本教程中,Stephen Walther 解釋瞭如何通過從您的 控制器層中分離 您的服務層來保持急切的關注點。

7

業務邏輯不應該被包含在控制器。控制器應該儘可能地瘦,最好按照圖案:

  1. 查找域實體
  2. 域實體
  3. 準備視圖/返回數據行爲造成

另外控制器可以包含一些應用邏輯。

那麼我在哪裏放置業務邏輯?在模型中。

什麼是模型?這是一個很好的問題。請參閱Microsoft Patterns and Practices article(榮獲AlejandroR出色發現)。在這裏有三大類車型:

  • 視圖模型:這是一個簡單的數據包,以最少的,如果有的話,邏輯從和意見傳遞數據,包括基本的字段驗證。
  • 域模型:脂肪模型與業務邏輯,在單個或多個數據實體進行操作(即,在比實體B動作的給定狀態的實體A)
  • 數據模型:存儲感知模型,邏輯包含在一個單獨的實體中僅涉及該實體(即,如果字段a當時的字段b)

當然,MVC是一個範式來自不同的品種。我在這裏描述的是MVC只佔用頂層,韋迪this article on Wikipedia

今天,MVC和類似的模型 - 視圖 - 演示者(MVP)是是專門適用於更大的系統的表現層的關注設計模式分離。在簡單的場景中,MVC可能代表系統的主要設計,直接進入數據庫;然而,在大多數情況下,MVC中的Controller和Model對服務層或數據層/層都有一個鬆散的依賴關係。這是關於客戶端 - 服務器體系結構

-1

如果您使用依賴注入器,您的業務邏輯將轉到它們,因此您將得到整潔乾淨的控制器。

相關問題