【问题标题】:How to design DTO for this scenario?如何为这种场景设计 DTO?
【发布时间】:2015-11-17 18:04:14
【问题描述】:

我有以下情况:

用户对象

  • 结构的一半数据存储在数据库中(归我所有)。
  • 另一半数据来自第三方(通过 web api)。
  • 另一个重要的一点是,我想使用 ExpressMapper(或任何其他好的建议)将实体/服务对象映射到 DTO。

我想使用 DTO 模式在不同层之间传输用户信息。

问题:

  1. 是否应该创建一个包含服务对象和数据库对象的所有属性的大型 DTO?

  2. 我是否应该创建第三方数据对象作为 DTO 的属性。我的意思是将服务数据对象隐藏在接口后面,并将该接口作为 DTO 的属性。

  3. 在情况 1 或 2 中是否需要为 DTO 制作接口?

【问题讨论】:

  • 我会让服务对象成为 DTO 的属性。你不应该需要它的接口

标签: c# design-patterns dto


【解决方案1】:

一般来说,最好的 DTO 设计与客户端的要求和返回它的方法/函数有关。我假设您这样做是为了序列化结果。

如果您只是将要存储的所有数据映射到 DTO,您并没有真正获得太多收益,并且可能只是以序列化方式发出您存储的数据对象。

所以回答你的问题

1) 不。出于几个原因,您应该使用与您正在拨打的电话相关的数据创建 DTO..

  • DTO 通常以串行方式通过线路传输。所以 更小 = 更少的数据。
  • 填充和序列化 DTO 可能会产生开销。你不 想要惩罚每个返回大 DTO 的调用 繁琐的过程只是为了填充与不相关的属性 通话的目的。
  • 可能需要更多的自我记录。

请记住,出于代码重用的目的,可以发送一些“不相关”的数据位。请注意有多少数据,以及生成数据的过程需要付出多少努力。这里没有什么硬性规定比可读性和效率更有意义。

2) 取决于您的应用程序,但我倾向于说知道它是第 3 方数据通常与调用客户端获取 DTO 无关。您从中获取数据的第 3 方也可能从第 3 方获取数据。但他们返回给您的 DTO 可能不会为您挑选出这些数据。

3) 接口,同样与您正在开发的应用程序有关。从客户端的角度来看,除非您在程序集中提供 DTO 库,否则任何接口都没有多大意义。如果 DTO 是由代理生成的(例如添加服务引用),或者客户端正在创建自己的 DTO 客户端版本,则这些接口将不会传递给客户端。

【讨论】:

  • 同意^^我只是想补充一下,小心这些映射器。 disqus.com/home/discussion/codingforfunandprofit/…(自动映射器链接,但概念相同)
  • 非常感谢您的回复。但是,你能在我的场景中提出一个好的方法吗?而且我的客户还需要访问我的数据库和第 3 方的所有属性。
  • 我在想能不能做一个DTO,在业务层做DO到DTO和ServiceObject到DTO的转换?
  • 在不了解您的项目的更多细节的情况下,提出建议有点困难。但是假设您的对象包含有关客户、他们的购买历史和其他各种信息的信息。您不希望每次调用都返回相同的对象。您想返回他们要求的特定于该呼叫的内容。
  • 因此,您的客户可能想要访问所有这些属性,但您显示的属性应该与他们向您进行调用的目的相关联。如果他们只想了解客户的基本信息,他们不需要购买历史记录。那将是一个不同的电话。基本上,一旦设计了所有 API,您就会拥有几个 DTO,它们共同揭示所有这些属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
相关资源
最近更新 更多