0

我们有一个 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/而不是使用接受标头,但是让它工作会很棒。

编辑: 我应该补充一点,我们使用媒体类型进行版本控制的部分原因是因为这是一项供内部使用的服务,并不意味着可以在公共网络上访问。

4

1 回答 1

1

您在同一个 URI 上注册了两种资源类型,只会选择一种,无法在请求时进行区分。

我不认为 URI 或媒体类型中的版本控制在网络上是一个好主意。也就是说,对于您想要的(不同的媒体类型),然后使用相同的资源类型并使用您的编解码器从传入/传出数据中填充相同的类型。这是 OR 中编解码器的职责,在 DTO 和媒体类型格式之间建立连接。

对于传入的请求,我们需要根据 URI 知道您想要什么资源类型。如果你有两种不同的类型,它应该是不同的资源。也就是说,如果您执行以下操作也可以:

ResourceSpace.Has.ResourcesNamed("myResource").AtUri("/myResource").HandledBy<ResourceV1Handler>().And.HandledBy<ResourceV2Handler>();
ResourceSpace.Has.ResourcesOfType<MyV1Resource>().WithoutUri.TranscodedBy<V1Codec>();
ResourceSpace.Has.ResourcesOfType<MyV2Resource>().WithoutUri.TranscodedBy<V2Codec>();

然后你可以写

public class handler {
  public object Post(MyV1Resource resource) {}
  public object Post(MyV2Resource resource) {}
}

那会奏效的。您将无法以这种方式实现 get,因为在大多数情况下,OR 假定一种资源类型 == 一个 URI。

至于泛型,如果您使用 IoC 容器,则可以以泛型方式注册您的处理程序(也就是注册 typeof(IHandler<>) 和 typeof(Handler<>))。这意味着任何 IHandler 都会被解析为 Handler。然后,您只需在注册中注册 HandledBy>() 即可。这同样适用于编解码器(但话又说回来,OR 中的编解码器用于处理媒体类型问题,而不仅仅是作为序列化机制,因为序列化本身对 Web 来说是邪恶的,应该很少使用)。

于 2012-06-07T15:04:04.957 回答