2009-11-02 106 views

回答

11

如果你有一個服務層,並使用your're它抽象業務邏輯從倉庫離開的方式(如你應該用一個服務層)則沒有,你的控制器只應做的服務電話方法。服務層將成爲與回購協議的耦合。

除了Mayo的回答:模型是將在整個應用程序(回購,服務和UI /控制器)中傳遞的數據類,以便UI/Web層像其他層一樣「操作」它們。

我認爲如果你實現的Fowler's definition上下文和modern aspnet mvcadaptions一個服務層,那麼你應該有你的控制器動作設計非常小巧輕便的方法,要求從服務層的「肉」的業務邏輯。

編輯:我想我並不清楚:具有服務層是唯一的選擇,我不是說,只是想回答有關在那裏你的情況下使用的問題的一部分一個服務層。同意,服務層並不總是必要的,特別是對於小型項目。

+0

+1服務層鏈接 – Mayo

0

所有的我一直用的例子似乎表明,該控制器應在模型上進行操作。

這麼說,我聽說過,一些作者認爲,該模型是由一切從業務邏輯數據存儲庫(而不是,許多人認爲是模範的業務對象類)。

就個人而言,我會盡量保持它的清潔/通過使控制器上保持一致,對倉庫操作類工作 - 但我不認爲這是反對它的硬/快治。

+0

評論你爲什麼不喜歡答案的人...否則沒有人學習。 :) – Mayo

+0

它說+1不是-1?雖然不是我參與了投票,但答案並沒有真正的幫助。在存儲庫/服務模式中,沒有模型是模型是存儲庫/服務。我想只是在服務上運行,但我不確定這是否會導致代碼重複過多 – LiamB

+0

我看到了......那麼可能會解釋-1。我只是假設你稱它爲不同的術語 - 並非一個不同的概念。給我今天的研究(工作緩慢的一天)。 – Mayo

-1

控制器解釋用戶輸入並通過查看準備車型使用,因爲我已經體會到了它。有些人真的很認真地去掉模型中的每一點邏輯,但我並不是那種肛門。

恕我直言,最好的選擇是使用DI從控制器內訪問您的存儲庫。

+2

我假設你是meen? 「來自控制器的每一點邏輯」, – LiamB

+0

嗯,不,模型中的每一點邏輯。模型不做任何事情,但存儲CONTROLLER爲響應用戶輸入/請求而收集的數據。 – Will

+0

這將是一個'貧血模型',大多數人不認爲是非常好的做法:http://en.wikipedia.org/wiki/Anemic_Domain_Model – UpTheCreek

0

服務層基本上是您的業務邏輯/業務模型的api。例如,您可能有一些方法可以獲得您的「最佳客戶」。服務層然後做它需要做的事情來查詢存儲庫,執行它需要做的任何邏輯等,然後返回客戶。在這種情況下,您應該始終通過服務層。

雖然有時你只是檢索對象,可能是在你的視圖模型,而不是在商業模式。當然,你可以在服務層的存儲庫中添加一個包裝器,但是你可能冒着混淆你的服務層和填充無意義的東西的風險。在這種情況下,我認爲直接訪問存儲庫沒有什麼壞處。

8

您並不總是需要服務層 - 在簡單的情況下,它只是過度設計解決方案。控制器調用存儲庫很好。但是,如果你看到你的控制器充滿了邏輯,或者你正在重複自己的控制器動作,那麼請考慮在控制器和存儲庫之間放置一個服務,並將一些邏輯從控制器轉移到服務層。

3

我同意@Sosh關於過度的工程問題。但是我發現控制器經過一項服務可以帶來很大的好處,當通過SOAP/REST通過線路重用該服務時,您的重構工作非常少。請記住,這違反了YAGNI,並且正在考慮未來(在某種程度上)。

但是再次 - 在閱讀Jeffrey Palermo的最新書籍 - MVC In Action後,他有一個直接與存儲庫進行零邏輯對話的控制器,它工作得很好。

+0

是的,關於Web服務的好處。 – UpTheCreek