【问题标题】:In repository pattern, should I use database model as my View model or should I create separate ViewModel for that?在存储库模式中,我应该使用数据库模型作为我的视图模型还是应该为此创建单独的视图模型?
【发布时间】:2015-07-02 06:57:39
【问题描述】:

不言自明,我有一个与我的数据库 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

【问题讨论】:

  • View-model 可以是视图可以用来呈现自身而不依赖外部调用的任何类型。但是,在您的特定情况下,User 实体最终可能包含一些敏感数据(例如 Password 属性),如果您必须序列化视图模型以供某些客户端脚本使用,它可以是个问题。

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


【解决方案1】:

一个好的编程的想法是视图不应该知道数据来自哪里......在视图中使用数据库模型破坏符号

最好始终使用ViewModel,将来您会对此选择感到满意,例如,视图可能只是数据库表中的 1:1,但想象一下设计师也希望您添加最新的“消息”,这只是基于用户的新表调用......

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

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

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

记住要区分关注点Controller 不应该知道数据来自哪里(因此,使用 Repositories)并且视图不应该进行数据操作(因此 @987654328 @)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 2011-05-26
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多