代码之家  ›  专栏  ›  技术社区  ›  Damovisa

ASP.NET MVC-我应该使用存储库模式将视图模型写入数据库还是先将它们转换为模型?

  •  9
  • Damovisa  · 技术社区  · 14 年前

    在我的asp.net mvc应用程序中,我有一个相当复杂的编辑页面,它将许多模型合并到一个视图中。

    我使用viewmodel模式来组合所有这些信息,并向视图呈现一个内聚对象。

    例如,我的viewmodel结构如下:

    CompanyId
    CompanyName
    List<Employee> Employees
    List<ContactMethod> ContactMethods
    

    employee对象有许多基本属性和首选的联系方法。

    在编辑页面上,用户被赋予公司的所有员工,他们可以添加和删除(使用javascript)以及编辑员工详细信息。ContactMethods列表用于填充每个员工的下拉列表。

    我已经成功地将我的模型(从数据库中读取)转换成这个viewmodel并再次转换,所以在编辑之后,我只剩下一个viewmodel,它代表了公司员工的当前状态。

    我正在使用存储库模式与数据库通信,所以我的问题是, 我应该直接调用companyrepository,传递viewmodel,还是应该在使用存储库将viewmodel写入数据库之前先将其转换回model对象?

    简而言之, 存储库是否应该知道我的viewmodel对象?

    3 回复  |  直到 14 年前
        1
  •  13
  •   reustmd    14 年前

    我会先将viewmodel转换回模型对象。我喜欢尽可能地保持web层和存储库层之间的依赖关系。

    我认为您的存储库不应该知道您的viewmodel,因为这是一个web级别的概念。

        2
  •  4
  •   heisthedon    14 年前

    view model是视图(ui)的模型,因此存储库不应该知道视图模型。分离它们将保持存储库与ui的松散耦合。

    使用另一层(如服务层)从ui封装存储库。 此层还执行viewmodel-model对话和respository调用。

    public class ServiceLayer
    {
       public void SaveModel(ViewModel viewmodel)
       {
          var model = viewModel.ToModel();
          repository.Save(model)
       }
    }
    
        3
  •  1
  •   Aaron Ransley    14 年前

    我同意先前将viewmodels转换回“普通”模型的答案,但我要补充的是,这个任务可能应该由一个单独的服务层执行。这一层将负责分解您的视图模型,并采取适当的行动。

    这本质上是服务的定义:其工作是执行需要多个模型和/或复杂逻辑的逻辑工作单元的东西。