【问题标题】:Is the ViewData and ViewBag object in ASP.NET MVC a Data Transfer Object (DTO)?ASP.NET MVC 中的 ViewData 和 ViewBag 对象是数据传输对象 (DTO) 吗?
【发布时间】:2018-01-04 19:39:08
【问题描述】:

如果我分配一些东西,任何东西,可以是 string 或 int,到 ViewData,我在视图中使用它。 ViewData 和 ViewBag 是否被视为 DTO?

您可以为它们分配一个对象,但您不必这样做。

这些是否有时被视为数据传输对象?

【问题讨论】:

  • 这只是一个自以为是的问题,没有真正的价值。为放置在 ViewData/ViewBag 中的 C# 对象命名没有真正的编程价值。恕我直言,放置在 VD/VB 中的任何对象都不是 DTO,因为它不会跨越任何实际边界。
  • @ErikPhilips 我同意这样的对象不是 DTO,我已经写了一个答案,但发现可以讨论什么是实际的 DTO。有些人可能会发现它表示系统中任何类周围传递的任何数据结构。
  • @Gilles 你应该把它作为答案。这个问题具有编程价值,因为不是每个人都知道 DTO 是什么或如何识别它,以及它是反模式还是其他东西。在 SoftwareEngineering 上问这个问题可能会更好。
  • @johnny 我取消删除了我之前的答案并稍作修改。

标签: asp.net-mvc dto viewbag viewdata


【解决方案1】:

我个人只会在跨层、服务或应用程序传输数据时使用术语 DTO。

Wikipedia 定义为:

是一个在进程之间携带数据的对象

还有这个在 StackOverflow 上得到高度评价的 answer 说:

数据传输对象是用于封装数据并将其从应用程序的一个子系统发送到另一个子系统的对象。

还有:

N 层应用程序中的服务层最常使用 DTO 在其自身和 UI 层之间传输数据。

这里我们讨论的是从服务层向 Web 应用程序发送数据,它们是独立的 IIS 应用程序,不一定位于同一台机器上。

对于 ViewBag,您仍然在同一层/子系统、Web 应用程序上,并且没有跨越任何应用程序边界。

您可能会争辩说 View 和 Controller 是不同的子系统,但这会扩展它,因为它们都在同一个编译单元(同一个 dll)中。您还可以争辩说,用作在其他两个类之间使用的数据结构的任何类都是 DTO,但这与 DTO 的普遍定义不一致,因为所有业务对象都将被视为 DTO。

【讨论】:

    【解决方案2】:

    是的,数据传输对象中分配给 ViewData 或 ViewBag 的值在视图中的处理方式与它们相同。就像您的 DTO 中有一个 int 类型变量一样,在您的视图中,您可以通过 ViewBag 以 int 的形式访问它。字符串和其他类型变量的大小写相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2011-03-14
      • 2019-09-23
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多