使用ServiceStack实现HATEOAS的正确方法

时间:2014-04-30 13:34:33

标签: web-services rest servicestack hateoas

know how mythz generally feels about HATEOAS,但是我要说我必须遵循我的REST服务中的HATEOAS原则,并将链接(“自我”,“父”和其他可能的关系)添加到我的DTO。

“self”和“parent”之类的链接包含资源的路径,这些路径当然与我的路径相关。

我正在为ServiceStack REST服务使用以下项目/部署结构。如果这很重要,我正在使用 ServiceStack 3.9.71

服务网关汇编:

  • 定义了我的DTO。每个DTO都有一个工厂从相应的域对象创建该DTO
  • 定义操作及其路线

服务实施大会:

  • 使用ServiceGateway获取DTO定义并访问其工厂
  • 执行任何域逻辑需要并通过前面提到的工厂创建相应的DTO

服务接口组装:

  • 定义我的REST服务和
  • 根据REST动词(GET,POST,...)从ServiceStack的HttpHandler调用ServiceImplementation

在哪里可以将链接信息添加到我的DTO?

选项1:

  

在我的服务网关中,当我自己构建DTO时。这似乎合乎逻辑:   我知道我需要了解的关于我的域对象的内容,我可以轻松地完成   建立链接。除了我的DTO现在都包括一个   额外的成员(链接)和建立这些链接迫使我   明确地提供路径/路由(即硬编码)。似乎领先   维持噩梦。

选项2:

  

在我的服务接口程序集中,我有请求上下文和   我知道我的路线。我可以封装我的服务实现   返回包含响应和链接的元对象   采集。但是,为了构建链接集合,我有时需要   域上可用的信息(即服务实施)   水平。对我来说,最大的“骗局”是它创造了一个新的附加   在我的所有回复中都是人为的。可以被视为一种方式   标准化响应格式,但我不喜欢它。

选项3:

  

我希望我能写一个包装器,一般“注入”一个“链接”成员到所有的DTO   我在服务接口程序集中通过挂钩进入ServiceStack返回。我没有   在那个方向上调查很多,因为我觉得我可能错了   这里的整个方法。

任何建议/建议欢迎。谢谢大家。

1 个答案:

答案 0 :(得分:2)

我不确定如果我建议你选项1或选项3,但这是我在尝试做同样的事情后出来的。

我是从this answer开始的。

现在you can access route metadata directly from filters

所以我目前的做法是:

=>服务创建dto响应以及将附加到响应的下一个超媒体链接集合。在这个级别,您可以按类型了解“操作”,但不知道您将如何构建路径。我认为域级处理操作工作流程是一致的。

=>在响应过滤器中,我从Metadata获取可用路由,并按照惯例从dto属性构建路由。最后路由被添加到http标头。

注意事项: 我正在绘制1 dto - 1路线。在其他情况下,这种方法可能会更加困难。