ASP.NET MVC 中的 ViewData 和 ViewBag 对象是数据传输对象 (DTO) 吗?

Is the ViewData and ViewBag object in ASP.NET MVC a Data Transfer Object (DTO)?

如果我将可能是 stringint 的东西分配给 ViewData,我会在视图中使用它。 ViewDataViewBag 是否被视为 DTO?

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

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

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

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

Wikipedia 定义为:

is an object that carries data between processes

此外,这个在 Whosebug 上受到高度赞扬的 answer 说:

A Data Transfer Object is an object that is used to encapsulate data, and send it from one subsystem of an application to another.

并且:

DTOs are most commonly used by the Services layer in an N-Tier application to transfer data between itself and the UI layer.

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

在 ViewBag 的情况下,您仍在相同的 layer/subsystem Web 应用程序上,并且没有跨越任何应用程序边界。

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