具有动态数据的 Servicestack 服务

Servicestack Services with dynamic data

我喜欢Servicestack并且已经购买了商业版。我需要提供基于元数据(在某些数据存储中)中定义的完全动态数据的 Rest 服务。因此,我知道数据的结构和数据类型,但不是通过 POCO,在某些情况下,数据(例如外部 Web 服务)将由用户探索,然后用户将确认数据类型、格式字符串等。用户可以扩展和配置通过前端的元数据。我希望能够利用 servicestack 的好处,但不提供 POCO,因为如果发生更改,我必须重新编译和重新部署。

有没有一种方法可以在不使用 POCO 进行编码的情况下为服务堆栈提供要从元数据中动态使用的结构。

即使有人可以指出我可以覆盖它以传入 POCO 结构的地方。

代码优先服务框架

ServiceStack 主要是一个代码优先的服务框架,它的许多功能都以代码优先的 POCO 为中心。如果没有定义良好的 POCO 来定义你的服务,就没有 ServiceStack 的元数据服务的源定义可以引用,也没有具体的类型可以反序列化等等。

返回自定义 JSON 或松散类型的 .NET 集合

根据您尝试使用动态非类型化数据实现的目标,您的服务实现可以 return 一个使用所需服务响应序列化的自定义 JSON 字符串。为了帮助生成 JSON,您可以 return List<T>Dictionary<string,T> 的无类型集合,以匹配您想要 return 的 JSON 的形状.

尽管没有类型化模型会失去使用定义明确的 DTO 的许多好处,客户将不再有类型化的 API 来调用或使用您的服务。

自动生成类型并动态注册服务

一个高级选项是使用代码生成来动态生成类型和服务实现。

implementation of AutoQuery which uses Reflection.Emit to dynamically generate missing Service implementations for AutoQuery Request DTO's采取了类似的方法。

在代码生成新的 Service 实现后,可以使用 IAppHost.RegisterService() API 将其注册到 ServiceStack:

var serviceType = GenerateMissingServices(misingRequestTypes);
appHost.RegisterService(serviceType);

这种方法适用于 AutoQuery,因为它使用 Request DTO 作为蓝图来生成服务实现,因此客户仍然受益于使用类型化请求和通用响应 DTO 来调用 AutoQuery 服务而无需任何代码-gen.

您也可以使用这种方法动态生成服务模型 (DTO),但由于没有可用的具体类型,客户需要使用 ServiceStack 的 Add ServiceStack Reference 功能为其生成类型化的 DTO首选语言。