2

Is there a reason why I need to supply IReturn or IReturnVoid references to ServiceStack's JsonServiceClient.Get? There must be a good reason (I'm quite new to the framework) but I don't understand why I have to convert my objects to IReturn wrappers or make them ServiceStack dependant.

I have read those posts but couldn't find the explaination I am looking for (only workarounds):

Thanks!

4

1 回答 1

6

JSON 是一种无类型的数据格式。好吧,有字符串和数字、数组和键/值对——仅此而已。

JSON over HTTP 不提供任何类型信息。

ServiceStack,就像大多数其他使用 HTTP+JSON 的 RESTful 服务一样,将像用其他语言编写的其他服务一样工作——来回传递 JSON。

将 IReturn 添加到您的服务方法不会使您的服务依赖于 ServiceStack - 您可以使用任何其他 HTTP 客户端发出请求并在响应中返回 JSON。

此外,您还可以选择使用“强类型”http 客户端 (JsonServiceClient),它会自动映射到客户端上与服务器端相同的 .NET 类型。因此,如果您想为您的服务编写本机 C#/.NET 客户端,这非常容易。

同时,如果您或其他客户想要编写通用的“非类型化”Web 服务客户端,它们也将按预期工作。

以下是我的想法,使用 ajax 客户端、无类型的 http+json Web 服务客户端和 ServiceStack 客户端:

通用网络浏览器:

  • 请求 (JSON) -> HTTP -> ServiceStack 服务
  • 响应 (JSON) <- HTTP <- ServiceStack 服务

通用 HTTP 客户端:

  • 请求 (JSON) -> HTTP -> ServiceStack 服务
  • 响应 (JSON) <- HTTP <- ServiceStack 服务

ServiceStack 的 JsonServiceClient:

  • 请求(JSON x/.NET 类型信息)-> HTTP -> ServiceStack 服务 IReturn
  • 响应(JSON x/.NET 类型信息)<- HTTP <- ServiceStack 服务 IReturn

通常,您会在 *.ServiceModel 程序集中引用来自客户端和服务器项目的 DTO 类型信息,您可以在两端使用它。由于 DTO 和服务的任何类型信息都在“那里”,因此客户端将知道如何将 JSON 反序列化为正确的类型。IReturn 是对象上的“标记”(元数据)——旧的 SS API 使用不同的接口来做同样的事情,但更冗长且灵活性更低(REST 与 SOAP 的返回似乎不同)。

另请注意,您的 DTO 不需要实现 IReturn - 因此它们不需要依赖于 SS。我更喜欢仅在“操作”或通信 DTO 上使用 IReturn - 那些正在传递参数的 DTO。我喜欢保留映射到数据库表(即 OrmLite)的 DTO,而没有 IReturn 依赖项。

https://github.com/ServiceStack/ServiceStack/wiki/C%23-client

于 2013-09-15T01:32:14.553 回答