在存储库模式中,我应该使用数据库模型作为我的View模型,还是应该为此创建单独的ViewModel?

时间:2015-07-02 06:57:39

标签: c# asp.net-mvc design-patterns asp.net-mvc-5

自我解释,我有一个模型,例如我的数据库以1:1映射:

public class User
{
    [Key]
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

如果我在我的View cshtml中使用它,那么是否有任何缺点:

@model User

或者我应该像这样创建另一个ViewModel

public class UserViewModel
{
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
}

并将其绑定到我的视图

@model UserViewModel

2 个答案:

答案 0 :(得分:2)

良好编程的想法是,视图不应该知道数据来自何处...使用视图中的数据库模型打破该符号

最好总是使用ViewModel,将来你会对这个选择感到高兴,例如,一个View可能只是数据库表中的1:1,但想象一下设计师想要的您还要添加最新的"消息",这只是基于用户的新表呼...

使用ViewModel,您可以轻松添加它,只需编辑您的视图和控制器,但如果您使用1:1,您将需要创建一个全新的ViewModel ...然后,一些视图具有ViewModel和一些不要......它会很乱!

为了帮助您,您可以随时使用AutoMapper来帮助构建ViewModel, AutoMapper 使用原始类中的数据自动填充目标类。

var userViewModel = AutoMapper.Mapper.Map<UserViewModel>(user);

请注意单独关注Controller不应该知道数据的来源(因此,使用Repositories),而View不应该进行数据操作(因此Controller)。

答案 1 :(得分:0)

一般来说,如果我们谈论可扩展性和维护,使用多层体系结构是很好的一点,即使您非常确定您不必显示除实体属性之外的任何其他数据,您也不能说100% 。在您决定显示其他数据的情况下,您必须扩展实体,这肯定是肯定的。另一个原因是事实上不能在解决方案中增加引用,并且通常会失去耦合。在表示层和数据层之间进行引用会非常好。

当然,您的示例非常简单,但肯定不会总是那种场景,因此表示层和数据层之间的直接引用不是一个选项。