我们有一个 OpenRasta 服务,我们希望使用媒体类型来对我们的资源进行版本控制。对于每个新版本,我们将有一组不同的 DTO,可以通过命名空间进行区分。对于每个版本的 DTO,我们都有相应的媒体类型。
所以 DTO 将被映射到这样的媒体类型:
Namespace.Dto.V1.MyResource -> application/vnd.Namespace.Dto.V1.MyResource+json
Namespace.Dto.V2.MyResource -> application/vnd.Namespace.Dto.V2.MyResource+json
存储库实现将特定于 DTO 的版本,但接口是通用的。我希望我的处理程序和编解码器也是通用的,所以我不需要为每个版本的 DTO 复制/粘贴它们。所以我希望我的路线看起来像这样:
ResourceSpace.Has.ResourcesOfType<V1.MyResource>()
.AtUri("MyResource/{resourceID}")
.HandledBy<MyResourceHandler<Dto.V1.MyResource>>()
.TranscodedBy<MyResourceCodec<Dto.V1.MyResource>>()
.ForMediaType(mediaTypeMapper.GetMediaType(typeof(Dto.V1.MyResource)));
//V2 of DTOs
ResourceSpace.Has.ResourcesOfType<V2.MyResource>()
.AtUri("MyResource/{resourceID}")
.HandledBy<MyResourceHandler<Dto.V2.MyResource>>()
.TranscodedBy<MyResourceCodec<Dto.V2.MyResource>>()
.ForMediaType(mediaTypeMapper.GetMediaType(typeof(Dto.V2.MyResource)));
这应该工作吗?例如,现在,我的服务似乎正在处理与MyResourceHandler<Dto.V1.MyResource>
GET 请求上的 Accept 标头无关的请求。
有什么想法吗?我们可以更改我们的方案以使用 URI,/v1/MyResource/
而不是使用接受标头,但是让它工作会很棒。
编辑: 我应该补充一点,我们使用媒体类型进行版本控制的部分原因是因为这是一项供内部使用的服务,并不意味着可以在公共网络上访问。