我正在开发一个新的API,我们需要进行多对多的版本控制。
我已经阅读了一些关于防御性编程的其他帖子,并且让DTO优雅地发展......我们肯定会在大多数情况下使用该模式。
但是,当我们对 CreateCustomer 进行重大更改并且需要 CreateCustomer2 DTO时,我希望能够自定义SS解析用于的类型的方式反序列化,否则我们将被迫使用这样的路线:
/ API / V1 / createcustomer
/ API / V2 / createcustomer
我宁愿保留 / api / createcustomer ,让版本号存在于Header / Querystring /中(不在这里寻找辩论:))。
是否有任何关于如何在ServiceStack中动态解析反序列化类型的示例,基于除路由+动词之外的参数?
非常感谢提前
答案 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>())
}
}