C# 中的数据传输对象 (DTO)

2025年2月5日 | 阅读5分钟

在本文中,我们将讨论 C# 中的数据传输对象 (DTO)。DTO 代表数据传输对象。它是一种在系统的一个部分到另一部分传输数据时使用的设计模式。DTO 是只包含属性的小类,不包含任何业务方法实现。它们通常部署在需要将数据信息从应用程序的一个层传输到下一层的情况,例如在业务逻辑层和表示层之间,或在客户端和服务器之间。

DTO 的主要目的是为在进程内或通过网络传递的数据提供结构。因此,通过使用 DTO,大多数业务逻辑和持久化职责应该从数据如何呈现或传输的内部细节中解耦。

何时使用 DTO?

DTO 通常在以下场景中使用:

  • Web API: DTO 用于使用 TCP/IP 协议在客户端和 HTTP 服务器之间通过网络共享信息。
  • 面向服务架构: 用于在微服务之间或不同系统之间同步信息。
  • 分层架构: 应用程序组织原则,其中应用程序的一个层发生变化不会影响其他层。

示例 1

让我们通过一个例子来说明 C# 中的数据传输对象 (DTO)。

输出

 
Product: Smart TV, Product Price: ?10,000.00
Product: Mobile Phone, Product Price: ?5,000.00   

说明

性质

  • PId (产品 ID):与特定产品关联的参考编号。
  • PName (产品名称):它是一个字符串,包含产品名称,可以是智能电视、手机或其他任何东西。
  • PPrice (产品价格):商店提供的产品单位价格的十进制值。这使得获得货币值的真实表示成为可能。
  • PStock (产品库存):一个整数,显示库存中可用产品的数量。这将有助于库存控制。

方法

GetDiscountPrice(decimal discountValue):此方法使用的参数是以百分比(discountValue)表示的折扣,折扣金额将从产品价格中扣除。IsInStock()。此特定方法根据产品可用性返回布尔值 true 或 false。它检查项目 PStock 属性是否大于零。它还可以用于证明某个特定产品是否在市场上可用。

域模型(Prod 类)定义了应用程序的核心业务对象,并考虑了产品的属性。它们是属性,包括 PId(产品 ID)、PName(产品名称)、PPrice(产品价格)和 PStock(产品库存)。该类还包含两个方法。具体的实例方法包括:

GetDiscountPrice(decimal discountValue):它返回产品的折扣价格。

IsInStock():它确定产品是否有库存。

使用 DTO 的好处

DTO 有几个好处。一些主要好处如下:

  • 解耦:使用 DTO 来保证实际各个域模型中的任何更改都不会影响在 DTO 对象之间传递的数据。
  • 安全性:这是因为 DTO 是一种接口构造,允许访问某些数据而不暴露所有细节。
  • 效率:DTO 还有助于识别哪些数据需要在分布式系统中频繁传输,传输中仅包含必要字段。
  • 可维护性: DTO 也有助于提高可维护性,因为 DTO 减少了层或服务的依赖性。
  • 关注点分离:域模型处理业务逻辑,而 DTO 处理数据传输。这使得在需要升级或添加时,代码更容易管理。
  • 灵活性:由于存在域模型并将其与服务层分离,因此更改 ProductDTO 的结构(例如添加/删除字段)不会对应用程序的其余部分产生重大影响。

何时不使用 DTO?

  • 小型应用程序:在层数较少、结构简单的应用程序中,使用 DTO 可能会使应用程序架构复杂化。
  • 性能考虑:如果您的应用程序对性能高度敏感,则在域模型和 DTO 之间进行转换可能会带来一些性能问题,尽管这种情况并不经常发生。

结论

总之,数据传输对象 (DTO) 在 C# 中使用于应用程序不同级别或分布式环境中的对象交换时尤其有用。它提供了一种结构化且高效的数据传输方法,并促进了解耦、安全性和可维护性。然而,在某些情况下,DTO 可能不是最佳选择,例如在高度复杂的应用程序和某些性能要求严格的场景中。在小型应用程序或需要极致性能的应用程序中,DTO 可能不值得额外的开销。总而言之,应根据特定开发项目的某些因素,将 DTO 的使用视为可以采用的策略之一。