【问题标题】:Should I implement business logic on a Model or a ViewModel我应该在模型还是视图模型上实现业务逻辑
【发布时间】:2016-06-07 06:20:24
【问题描述】:

当我在 MVVM 应用程序中处理业务逻辑时。我应该在 Model 还是 ViewModel 上执行此操作?

例如,如果我想在资产被重新估价后重新计算成本,我应该对模型进行操作吗?

在 ViewModel 上这样做有优势吗?

如果我有一个 ViewModel 列表,但我想将其转换为一个模型列表以便进行一些处理,会发生什么?我可以将模型公开为 ViewModel 的属性(并使用它来构建模型列表)。但这意味着 View 将能够访问原始模型的属性

【问题讨论】:

  • 将其添加到模型中,viewmodel 主要仅用于演示,并且是演示和模型(数据载体)之间的中介。 viewmodel 的另一个用途是不要触及模型的结构,如果要添加不应反映在数据库中的字段,请将其添加到 viewmodel 中。在这种情况下,模型未被触及
  • 错误的社区,最好位于Programmers

标签: c# mvvm


【解决方案1】:

我的建议是将逻辑放在服务层中。 这是视图模型和模型之间的中间层(在真正的面向对象范例中,它应该只包含属性)。 所以正确的生命周期可能是: 查看模型 -> 服务 -> 模型处理。 如果需要,这还允许通过其他视图模型重用业务逻辑代码

【讨论】:

  • 这是有道理的。那么在这种情况下,视图是如何绑定到模型上的属性的呢?如果视图绑定到模型,而不是视图模型,那么视图模型似乎有点多余。如果视图绑定到视图模型,那么如何实现 2-way 绑定,以便将受服务影响的模型更改传播回视图?
  • 视图边界视图模型。 viewmodel 通常是: - 由 View 限制的类,包含 ViewModel 限制的数据并调用服务层 - 视图使用的模型的包装器或上面使用的另一个视图模型 - 服务调用“纯”模型 - 服务返回一些数据由视图绑定的视图模型提供服务
  • 这听起来是个好主意,但您如何实际实施呢?例如,我有一个名为UpdateTiming() 的方法,它计算三个属性。最初,在重构时,我将 ViewModel 作为参数传入,以便它可以设置这些值并且 UI 会更新。但现在服务与 ViewModel 紧密耦合。相反,我应该将模型作为参数传递并返回一个元组,然后从 ViewModel 中更新属性吗?似乎有很多额外的代码。
  • @Adam 我希望你已经明白了。服务通常在模型上工作,并返回模型或任何适合的情况。服务返回的值用于new 向上一个 ViewModel 对象。说得通?因此,在大多数情况下,您需要将 Model 转换为 ViewModel,有时反之亦然,您可以使用像 this one 这样的映射器。
  • +1 这应该是公认的答案。复杂的业务逻辑应该写入服务层,供 ViewModel 和 Model 使用。
【解决方案2】:

模型的目的是代表(或建模)您的业务领域。因此,根据定义,业务逻辑位于模型中,而不是视图模型中。

ViewModel 的工作是公开 Model 的属性和字段,并准备好供 View 使用。

例如,想象一个银行应用程序。模型可能代表一个帐户。也许模型有一个帐户余额。模型的工作可能是跟踪余额并确保维护某些不变量(例如不允许大于余额的提款)。 ViewModel 的工作可能是将余额转换为字符串,用作 View 中的绑定。

您希望尽可能多地保留 ViewModel 之外的逻辑,以保持您的代码可重用和松散耦合。

【讨论】:

  • 我不同意这一点。理想情况下,模型应该只具有属性,因为模型代表数据。 ViewModel 对于 BL 来说是一个ok的地方。我会尽可能将 BL 放在模型和 ViewModel 之外。至于您的最后一句话,模型比 ViewModel 更正确。根据定义,ViewModel 与 View 紧密耦合。
  • @gldraphael ViewModels 根据定义与视图没有紧密耦合。 ViewModels 从 MVP 中出来,通过观察者模式和数据绑定与 Views 松散耦合
  • @david 我现在确实有不同的意见。业务逻辑属于领域模型。似乎早在 2017 年,我就在考虑 EF 模型,即 DAO 或数据模型类。
【解决方案3】:

如果您正在构建网络应用程序,请使用该模型;如果您正在构建 LAN/desk 应用程序,则在模型下面一层,即域级别。

您的问题 - 在资产重新估价后重新计算成本 - 可能不仅仅是用户界面问题。后端应用程序可能想要做同样的事情(例如,自动导入数据)。然后,您可以选择复制业务逻辑或重新布线到现有逻辑。

后端使用相同的模型也没有错。但是模型——尤其是断开连接的模型——往往是大型数据结构,因为它们需要从引用表中携带所有数据(除非你想往返于服务器并牺牲你的 GUI 体验)。如果使用模型,这可能会影响性能。

【讨论】:

    【解决方案4】:

    如果您的模型包含计算所需的数据,您可以使用模型。如果模型不包含数据意味着创建视图模型并获取数据来进行计算。(关于业务逻辑)

    如果您想将这些数据传递给视图创建视图模型,它会提高代码重用机会

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多