ServiceStack版本控制 - 如何根据版本控制

时间:2015-06-08 22:27:15

标签: servicestack

我正在开发一个新的API,我们需要进行多对多的版本控制。

  • 旧客户 - >新服务器
  • 旧服务器 - >新客户
  • 一切都在 之间

我已经阅读了一些关于防御性编程的其他帖子,并且让DTO优雅地发展......我们肯定会在大多数情况下使用该模式。

但是,当我们对 CreateCustomer 进行重大更改并且需要 CreateCustomer2 DTO时,我希望能够自定义SS解析用于的类型的方式反序列化,否则我们将被迫使用这样的路线:

/ API / V1 / createcustomer

/ API / V2 / createcustomer

我宁愿保留 / api / createcustomer ,让版本号存在于Header / Querystring /中(不在这里寻找辩论:))。

是否有任何关于如何在ServiceStack中动态解析反序列化类型的示例,基于除路由+动词之外的参数?

非常感谢提前

1 个答案:

答案 0 :(得分:1)

推荐的版本控制方法是利用自然forwards compatibility of message-based services并以防御方式扩展现有服务,以便它可以支持多个客户端版本,并避免创建同一服务的多个版本。

如果您仍希望公开/api/v1路由,我建议您在基础架构级别使用反向代理重新路由/api/v1/api/v2请求ServiceStack的不同运行实例。

如果您想在代码中执行代理,可以使用base.ResolveService<T>()base.ExecuteRequest()在代码中执行不同的服务,使用ServiceStack的内置AutoMapping来填充不同的DTO& #39; s看起来像:

[Route("/customers")]
public class CreateCustomers {
    public int Version { get; set; }
}

public class CreateCustomersV1 { ... }

public class CreateCustomersV2 { ... }

public class CustomerServices : Service
{
    public object Any(CreateCustomers request)
    {
        return request.Version == 1
            ? base.ExecuteRequest(request.ConvertTo<CreateCustomersV1>())
            : base.ExecuteRequest(request.ConvertTo<CreateCustomersV2>())
    }
}