2012-11-29 69 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。不幸的是没有巧妙的解决方案。如果你找到一个,请发表评论,因为我想听到它:)