45

我一直在使用MVC框架一會兒,我真的很喜歡這些問題是如何分離出來的。我已經陷入讓控制器做很多工作的壞習慣。所以我真的在尋找一些建議。服務層和存儲庫

當我第一次開始使用MVC時,我經常讓控制器在數據庫工作完成後對模型進行操作。我知道這很糟糕,所以搬到模型中。不過,我並不滿意,因爲我希望我的模型能夠很好地學習。

我已經做了一些閱讀,我發現人們通過擁有一個服務層保持他們的控制器和模型精益,我喜歡它的外觀。

我只是想了解服務層和存儲庫應該如何一起工作。這是我的假設,你能否讓我知道這是否是一種好的工作方式?

  1. 控制器可以直接調用庫中,如果沒有操作需要對數據和作爲這樣一個服務層完成並不需要涉足
  2. 一旦任何工作需要做數據(業務邏輯),那麼這應該在服務層中完成,並且控制器將根據需要對服務層進行簡單調用
  3. 一旦服務完成它的業務邏輯,它就會根據需要使用存儲庫(如果數據需要堅持)。
  4. 理想情況下,模型應該保持精益,理想情況下只能作爲DTO使用
  5. 驗證數據將在模型內完成(使用MonoRail驗證屬性)。我很欣賞,即使人們喜歡用很多屬性來污染他們的模型,但這是一個不同的討論。我喜歡MonoRail的驗證屬性在UI中自動jQuery驗證的好處。

我想把我所有的代碼都轉到單責任原則,因此試圖理清我的編碼實踐。

謝謝

回答

25

首先,沒有一套規則在任何情況下都能正常工作。你如何建模你的應用程序很大程度上取決於項目的類型和複雜性。話雖如此,這裏有一些想法:

  1. 從控制器調用存儲庫沒有錯。只要確保控制器不包含業務邏輯。
  2. 該服務負責(一些)業務邏輯並使用其他服務來執行此操作。存儲庫是一種服務,從服務調用它沒有任何問題。
  3. 模型應該包含業務邏輯,實際上你應該總是試着把它放在模型中。如果您需要外部數據來執行該業務邏輯(從另一個模型或存儲庫),那麼您應該創建一個服務。
  4. 模型驗證沒有問題。使用屬性與否是品味的問題(如果你喜歡它,那就很好)。如果模型過於複雜(創建一組外部規則),請在模型外部移動驗證。

最重要的是,做什麼感覺是正確的(這通常是正確的答案)。

+0

我有把業務邏輯模型中唯一擔心的是,通過屬性包(或不過)傳遞的模型集合時的UI,你可能開放的業務邏輯的用戶界面。 – 2008-11-28 20:43:50

+3

我同意你的意見,我只是覺得過多的業務邏輯應該存儲在一個單獨的服務層。儘量保持您的模型,視圖和控制器儘可能小 – StevenMcD 2008-11-28 22:35:29

5

This視頻提供了很大的洞察到如何組織你的asp.net MVC解決方案,並關注解決分離,更好的可測試性。希望它能幫助別人。我從中學到了一些好東西。