Service Stack 的 DTO 模式真的有用吗?

Is Service Stack's DTO pattern really helpful?

好吧,我过去使用过 ServiceStack ORMLite,现在尝试使用 ServiceStack RESTful DTO 模式。我过去使用过 WCF/Web API,对我来说,使用不同方法的服务是一种自然的范例,您只需在需要时进行 RPC 调用。但是,在阅读 Servicestack 的 DTO 模式及其旗舰参数时:

When you're working with a remote interface, such as Remote Facade (388), each call to it is expensive. As a result you need to reduce the number of calls, and that means that you need to transfer more data with each call. One way to do this is to use lots of parameters. However, this is often awkward to program - indeed, it's often impossible with languages such as Java that return only a single value.

The solution is to create a Data Transfer Object that can hold all the data for the call. It needs to be serializable to go across the connection. Usually an assembler is used on the server side to transfer data between the DTO and any domain objects.

这个论点本身就给我提出了很多问题:

  1. 这是否意味着当加载处理 Product 对象的页面时,我们只需从 Product table 中获取所有数据并保留它以供任何重复使用(潜在的重复使用)?
  2. 如果一次调用 Get all 得到大量数据怎么办?我可以不争辩说,有时 "GetAll" 在一个调用中带来很多不必要的数据,然后在需要时返回服务器是一个更好的主意吗?
  3. 此外,在我看来,该模式假设客户端开发人员将利用它作为 DTO 模式。该服务将被调用一次,返回的数据将在内存中保存很长时间以供进一步重用。如果我是一个糟糕的开发人员并且完全无视这个服务是为大量重用而设计的事实并且每次需要任何数据时最终都会调用服务怎么办?不就是两刃剑吗?

Data Transfer Object pattern isn't the only pattern ServiceStack's message-based services benefits from, it also adopts the related Remote Facade and Service Gateway pattern, this previous answer and the docs lists Advantages of message-based Services.

Does it mean that when a page loads which deals with Product object then we just bring all the data from Product table

无粗粒度接口不是将整个产品数据集和缓存放在客户端上。您只会 return 对那个上下文有用的数据,所以如果您需要有关产品的信息,那么您会 return 对客户在查看产品时有用的产品和相关元数据,例如category/supplier 信息,以防止客户端必须执行多个服务调用来获取他们需要的内容,从而减少延迟,减少需要 maintained/documented/learned 的 API 表面积,使相同的服务更可重用对于具有支持多个客户端的单个缓存条目的不同客户端用例,当 UI 更改时,不太可能需要重写后端服务 - 而不是特定于客户端的 RPC 调用。

What if one call Get all ends up being a lot of data?

不,当您只需要摘要搜索结果时,请不要关闭完整的数据集。将搜索优化为 return 仅需要在搜索结果中显示的数据。查看单个数据集时,您可以获取与产品相关的元数据。

What if I am a bad developer and completely disregard the fact that this service is designed for a lot of re-use and ends up calling service every time any data is required. Wouldn't that be two edged sword?

当 API 消费者的现有服务正在 return 获取他们需要的数据时,他们不太可能会寻找不同的 API 来调用。具有更少更粗粒度的 API 调用自然有助于减少更容易缓存的调用,从而减少延迟,即使对于不知道如何构建高效并发 API 调用的天真的开发人员也是如此。