【问题标题】:Passing ViewModel from Presentation to Service - Is it Okay?将 ViewModel 从 Presentation 传递到服务 - 可以吗?
【发布时间】:2013-05-21 17:58:33
【问题描述】:

在我的一个观点中,我有一个 ViewModel,我从两个表中填充它,然后将 List<ViewModel> 绑定到一个可编辑的 GridView(ASP.NET Web 窗体)。

现在我需要将编辑后的List<ViewModel> 发送回服务层以在数据库中更新它。

我的问题是 - 可以将 ViewModel 发送回服务,还是应该留在演示文稿中?如果不是 - 我应该更好地使用 DTO 吗?非常感谢。

【问题讨论】:

  • 我认为该方法没有任何问题
  • 视图模型是表示层。您应该使用 DTO。
  • 虽然这是个好问题,但老实说它不太适合 StackOverflow 格式,见faq没有实际问题需要解决:“我很好奇如果其他人和我一样。”

标签: asp.net design-patterns


【解决方案1】:

好问题!

在与我的队友进行了几次(激烈的)辩论后,加上我对 MVC 应用程序的经验,我不建议将 viewmodel 传递给您的服务/域层。

  1. ViewModel 无论如何都属于presentation。
  2. 因为 viewModel 可以是不同模型的组合(例如:从 10 个模型构建的 1 个 viewModel),您的服务层应该只与您的域实体一起使用。

否则,您的服务层最终将无法使用,因为您的 viewModel 受制于一个视图的具体细节。

https://github.com/AutoMapper/AutoMapper 这样的好工具是用来完成映射工作的。

【讨论】:

    【解决方案2】:

    不会这样做。我的规则是:为服务方法提供完成工作所需的一切,仅此而已

    为什么?

    1. 因为它减少了耦合。服务方法通常来自多个来源(消费者)。对于消费者来说,完成一个简单的方法签名比构建一个相对复杂的对象(如视图模型)要容易得多,否则它可能与它无关。它甚至可能需要引用一个它不需要的程序集。

    2. 它大大减少了维护工作。我认为普通开发人员花费超过 50% 的时间检查和跟踪现有代码(甚至更多)。现在每个人都知道,寻找那里的东西会花费不成比例的时间:你必须到处才能确定。如果一个方法接收到的参数(或带有属性的对象)没有被直接使用,也没有在调用堆栈的下方使用,那么您或其他人将一次又一次地走过这条漫长的道路。

    因此,如果视图模型中有任何不参与服务方法的内容,请不要使用它来调用该方法。

    【讨论】:

    • 我一直倾向于这一点(即使用它自己的模型而不是 VM)但是 ViewModel 将具有与 Model 完全相同的属性的情况呢?这不会被视为重复吗?
    【解决方案3】:

    是的。我很确定没问题。

    尝试使用MS Entity Framework,它会帮助你分配。

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      相关资源
      最近更新 更多