2012-11-29 100 views
0

我有一個模型和一個只包含我需要在JSON中公開的屬性的部分模型。模型和部分模型,如何避免冗餘代碼?

但模型和他的部分模型之間的屬性是多餘的。

我該如何避免這種情況或改進我的方法?

namespace Dashboard.Models.UserModels 
{ 
    public class UserModel 
    { 
     public int id { get; set; } 
     public string dbName { get; set; } 
     public string firstname { get; set; } 
     public string lastname { get; set; } 
     public int idExternal { get; set; } 
     public int idInstance { get; set; } 
     public string login { get; set; } 
     public string password { get; set; } 
     public DateTime? dtContractStart { get; set; } 
     public DateTime? dtContractEnd { get; set; } 
     public string emailPro { get; set; } 
     public string emailPerso { get; set; } 

     public LuccaUserModel() 
     { 
      idInstance = -1; 
     } 

     // partial model for json result 
     // not sure is the best way or have to be here 
     public class PartialUserModel 
     { 
      public int id { get; set; } 
      public string firstname { get; set; } 
      public string lastname { get; set; } 
      public string emailPro { get; set; } 
      public string emailPerso { get; set; } 
      public DateTime? dtContractStart { get; set; } 
      public DateTime? dtContractEnd { get; set; } 
      public string url { get; set; } 
     } 

     // UserModel Methods 
    } 
} 
+0

這不是'[JsonIgnore]'是爲了什麼? – paul

+0

@paul:Darin Dimitrov建議避免它([源](http://stackoverflow.com/a/12110508/652669)),所以我不知道。 :■ –

回答

1

可以重命名PartialUserModel UserModelBase類(或離開它,因爲是......它只是使更好的邏輯意義這樣做),並以的usermodel繼承自它:

public class UserModel : UserModelBase 
{ 
    ... 
} 

當然你在這種情況下,需要從UserModel中刪除所有重複的屬性。

1

做一個適當的設計和建立一個矯枉過正的設計之間的一條細線。答案取決於很多投入,其中我選擇了最重要的項目和模型廣度。

爲了讓我的答案更清晰,我不得不說我使用了不同的術語。用於UI的數據通常稱爲ViewModel。在你的情況下,你會建立UserViewModel其中包含必要的信息子集。

如果我正在做一次性項目,我將重新使用模型作爲ViewModel。我將通過使用幫助程序方法來執行此操作,該方法可以刪除敏感信息,加載或切斷從數據庫延遲加載的數據並對數據進行其他準備。所有這些都是在相同的模型類上完成的。

如果這不是一個短期項目,我希望創建單獨的ViewModel類,這些類是從模型數據映射而來的。然後,如果我使用的是大多數平面數據,我使用AutoMapper tool來自動複製數據,而不是編寫自己的映射器。

作爲另一個答案,在這裏指出,你需要在UI中編寫一個需要的數據的基本類,並用其他模型數據擴展它,但這不是一個好的方法,原因有幾個。

  1. 如果違反了關注點分離。處理模型和堅持的項目不應該瞭解您的ViewModel
  2. 您可能需要將來自相關對象的數據平鋪到ViewModel對象中。在這種情況下,你的模型對象應該有不應該在那裏的字段,否則會是多餘的。
  3. 您可能需要ViewModel中的計算字段和輔助方法,這些方法將再次以模型結尾,將每個未更新設計的人混淆。
  4. 你可能想通過幾個不相關的模型類,以相同的ViewModel類

要嘗試,並把它很快,要麼重用模型類或創建的ViewModels。不幸的是沒有巧妙的解決方案。如果你找到一個,請發表評論,因爲我想聽到它:)