2013-02-18 79 views
2

我在我的MVC應用程序中有一個名爲「Stores」的類,它有一個名爲「IsInCompliance」的類,它依賴於其他幾個字段的值。邏輯會通過並說「如果這,這,這是真的,那麼IsInCompliance是真的」。商業邏輯是否應該在模型中? (MVC4)

這應該屬於模型定義中,還是將這種邏輯放置在服務層或控制器中?我想我有四個選項:在模型中包含的方法

  1. 邏輯包含在一個控制器
  2. 邏輯寫回模型包含在服務
  3. 邏輯模型調用
  4. 控制器呼叫的服務中包含的邏輯

哪個最好?如果3最好,那裏沒有循環依賴(因爲我的模型項目取決於服務項目,這取決於模型項目)?

+0

它取決於邏輯。如果它正在查看屬性本身,那麼我會選擇1.如果其邏輯看待其他類,那麼它應該是選項4. – RPM1984 2013-02-18 04:38:29

+0

http://blogs.msdn.com/b/aspnetue/archive/2010 /09/17/second_2d00_post.aspx - 希望這會有幫助 – ssilas777 2013-02-18 11:44:07

回答

2

4號是正確的方法。控制器應該作爲一個薄的「流量控制」層,並將所有邏輯委託給它們下面的服務層(或者,如果它不是太明顯的邏輯,就是業務層 - 但這是一個不同的體系結構問題)。

您的模型通常應該是一個純粹的POCO結構,可選地包含數據模型內部的微邏輯。例如,ID生成和數據完整性操作。

你的大部分邏輯(對於相對簡單的/基於CRUD的應用程序)通常應該駐留在服務層中。

+1

+1對於Ofer Zelig。通常這種模式很常見,適合許多堅實的設計方法。我使用COntroller => Service Layer => Repository。模型在服務和存儲庫中被引用。在MVC中使用相同的模型是一個討論點。但是經常完成。該模型包含管理屬性並執行檢查和規則的邏輯,這些邏輯可能不參考其他對象。 – 2013-02-18 11:13:37

+0

將所有的邏輯放在服務中將導致貧血域模型。 http://martinfowler.com/bliki/AnemicDomainModel.html – 2013-02-21 16:26:12

+0

你是對的@RikLeigh,這就是爲什麼我說你的邏輯最基本,並將其設計爲相對簡單/基於CRUD的應用程序_。如果您有真正的業務情景 - 樹木,決策,工作流程,算術等,您應該將它們放在另一個層面,無論是他們所謂的「業務層」還是「域模型」。 – 2013-02-22 01:57:11

3

這是一個偏好/風格問題,但我始終認爲與Model對象密切相關的方法屬於該對象。

拿這個作爲一個例子(我編碼在飛行中沒有一個開放的VS.NET的實例,所以請原諒任何語法錯誤,只是想以此作爲交流的載體):

public class Person 
{ 
    public Int32 Age { get; set; } 

    public bool IsEligibleToEnterLegallyBindingContract() 
    { 
     return Age >= 18; 
    } 
} 

我會斷言模型對象包含反思自己的屬性並且不依賴於消息和/或其他模型對象的屬性的方法是良好的對象設計和MVC環境中的良好建模方法。

更新我和一位同事討論過這個問題,他指着我走向了由Martin Fowler撰寫的優秀文章Anemic Domain Model。在我的同事推薦它之後,我多次閱讀這篇文章。

從福勒先生的文章最後一段(這是從martinfowler.com和信貸的直接報價被確認,並給該網站):

「在一般情況下,更多的行爲,你的服務發現,那麼你越有可能搶奪領域模型的好處,如果你所有的邏輯都在服務中,那麼你就會失明。

0

MVC是關於分離問題。保持這種方式。將業務邏輯放置在單獨的類(層)中,從而將邏輯與數據分開。

0

通常我會在模型上執行操作而不是在模型中執行操作,但它是一種個人偏好。 我會(在你的情況下)在服務層中寫入邏輯,然後從控制器上進行一個協調調用,該調用將在模型上工作。然而,這說,我相信有人將此稱爲Anemic Domain Model

我不認爲任何的方法是錯誤的,但我個人會去數4

0

我想這取決於你的編碼風格。

根據您的要求,選項1或選項4都是正確的。

對於這樣的事情,我認爲選項1是正確的。

如果IsInCompliance僅依賴於模型中其他屬性的值,那麼它應該在模型中。

如果IsInCompliance的值依賴於其他類,那麼是的,它應該在服務層。

移動這樣的東西在一個貧血的領域模型服務層的結果在您的模型類,最終只是成爲DTO的

在面向對象的設計,這被認爲是一個反模式。

仍然有很多東西需要在服務層,我只是不認爲這是其中之一。

相關問題