具有动态数据的Servicestack服务

时间:2015-02-10 13:40:20

标签: servicestack

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

使用POCO进行编码时,没有办法可以提供具有动态使用元数据结构的服务堆栈而不进行编码。

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

1 个答案:

答案 0 :(得分:0)

代码优先服务框架

ServiceStack主要是代码优先的服务框架,其许多功能都以代码优先的POCO为中心。如果没有明确定义的POCO来定义您的服务,那么ServiceStack的元数据服务的源定义就没有,或者要反序列化的具体类型等等。

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

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

虽然没有打字型号会失去使用定义良好的DTO的许多好处,客户将不再拥有打字或使用服务的类型API。

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

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

implementation of AutoQuery采用类似的方法,使用 Reflection.Emit AutoQuery Request DTO's动态生成缺少的服务实现。

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

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

这种方法适用于AutoQuery,因为它使用Request DTO作为蓝图来生成Service实现,因此客户端仍然可以通过使用类型化的Request和Generic Response DTO来调用AutoQuery Services而无需任何代码

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