2015-12-16 33 views
0

我知道模型不應該有任何邏輯,但我不知道在哪裏放置檢查或更新功能的好地方型號在哪裏把模型的檢查功能(asp.net mvc5)

ex。

public class GuestBook 
    { 

     public int money { get; set; } 
     [Required] 
     public string name { get; set; } 
     [Required] 
     public string email { get; set; } 
     public DateTime content { get; set; } 
     public bool rich() 
     { 
      if (this.money <3000) 
       return false; 
      else 
      return true; 
     } 
     public void earn(GuestBook b) 
     { 
      this.money += b.money; 
     } 
    } 

功能豐富()和獲得()僅使用此模塊(留言板) ,如果我沒有把它放在這個模塊中,然後在那裏我應該把?

+0

在我看來,你需要創建商業邏輯類,它將包含這些方法,你可以從控制器調用它們。 –

+1

「我知道這個模型應該沒有任何邏輯」誰告訴過你的?在OOP中,模型具有封裝自己的規則和內部運作的特定理由。如果你的「模型」不是真正的類,而只是屬性包,你有一個貧血域模型http://www.martinfowler.com/bliki/AnemicDomainModel.html – kai

+0

@ kai點是好的。如果我是對的,你正在使用代碼優先的方法。你可以在流利的API中使用這種驗證:) – vinodh

回答

0

遵循良好的面向對象設計原則,真正保護類的不變量(並且不具有可維護性的噩夢)的唯一方法是不允許它們被類以外的人改變。通常,這是通過不公開setter方法(public auto properties are evil),使您的字段readonly(儘可能),並從構造函數初始化它們來完成的。

有類的要點是將數據與行爲分組。包含ints和字符串的簡單數據結構不是OOP意義上的類,它只是一個結構。

在某些情況下,您被一個更加惡毒的ORM卡住,它會強制您公開所有屬性。這對於Entity Framework(以及其他一些框架)來說不是問題,但是EF可以神奇地反映並訪問私有設置器(如果需要的話),您只需確保也有私有默認構造器。

0

根據你的類豐富方法驗證和賺取方法應用的業務邏輯。您可以爲可以觸發ModelState.IsValid的豐富方法邏輯創建AdditionalMetadataAttribute,並創建應用所有業務邏輯的BO類所需的賺取方法。 這裏是一個link for AdditionalMetadataAttribute