【问题标题】:Servicestack Services with dynamic data具有动态数据的 Servicestack 服务
【发布时间】:2015-04-10 13:41:45
【问题描述】:

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

在使用 POCO 进行编码时,如果不这样做,就无法为 servicestack 提供从元数据动态使用的结构。

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

【问题讨论】:

  • 您是否尝试过使用松散类型的集合,例如List<string>, Dictionary<string,string>?
  • 我正在做 Dictionary 但需要根据我的元数据提示序列化器/反序列化器在不同数据源上一致地序列化/反序列化的类型。我不希望 _type 属性使 json 结果膨胀,尽管将 _type 作为 json 的一部分。使用字典,因为我需要使用括号表示法,因为我从元数据中获取字段名称。我不能使用 Person.Name ...必须执行结果 [“Person.Name”]。所以我有动态数据,但来自元数据..不是代码
  • 关于您最终用于此案的任何信息?我有同样的要求,我正在考虑使用Dictionary<string, object> 之类的东西(希望它能起作用......)。

标签: servicestack


【解决方案1】:

代码优先服务框架

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

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

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

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

自动生成Types并动态注册Services

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

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

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

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

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

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

【讨论】:

  • 客户端调用将通过我们通过定义明确的 Rest 访问的元数据进行。因此,我们向客户公开的服务类型正确,因此他们可以通过我们的元数据调用资源,但结果(POCO 和数据结构和规则)是元数据驱动的。写下您的评论“如果没有明确定义的 POCO 来定义您的服务,就没有可供 ServiceStack 的元数据服务参考的源定义。有没有办法将其传递或提供给 Servicestack,而不是从 POCO 获取它。
  • @Andy 不,ServiceStack 通过查看服务实现来发现并自动装配使用的 DTO。 DTO 类型也会缓存在整个 ServiceStack 中,其中大部分功能都挂起 - 需要类型。
  • 是否有可能对此进行电话讨论/电话支持。很难书面解释
  • 别担心..会用字典等试试。谢谢
猜你喜欢
  • 2012-11-21
  • 2012-11-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多