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ヘッダーに関係なく、リクエストを処理しているようです。

何かご意見は?/v1/MyResource/acceptヘッダーを使用する代わりにURIを使用するようにスキームを変更することもできますが、これを機能させるのは素晴らしいことです。

編集: バージョン管理にメディアタイプを使用している理由の一部を追加する必要があります。これは、これが内部使用のサービスであり、パブリックWebでアクセスできるようにするためのものではないためです。

4

1 に答える 1

1

同じURIに2つのリソースタイプを登録している場合、1つだけが選択され、要求時に区別する方法はありません。

URIやメディアタイプのバージョニングはウェブ上では良い考えではないと思います。とはいえ、必要なもの(異なるメディアタイプ)については、同じリソースタイプを使用し、コーデックを使用して、着信/発信データから同じタイプを入力します。これは、ORのコーデックの責任であり、DTOとメディアタイプ形式の間のジャンクションを作成します。

着信リクエストでは、URIに基づいて必要なリソースタイプを知る必要があります。2つの異なるタイプがある場合、それは異なるリソースである必要があります。それはあなたが次のことをすればそれもうまくいくだろうと言った:

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) {}
}

そしてそれはうまくいくでしょう。ORは、ほとんどの場合、1つのリソースタイプ== 1つのURIを想定しているため、この方法でgetを実装することはできません。

ジェネリックスに関しては、IoCコンテナーを使用する場合、ジェネリックス方式でハンドラーを登録できます(別名register typeof(IHandler <>)with typeof(Handler <>))。これは、すべてのIHandlerがハンドラーに解決されることを意味します。その後、HandledBy>()を登録に登録するだけで、完了です。同じことがコーデックにも当てはまります(ただし、ORのコーデックは、シリアル化自体がWebにとって悪であり、めったに使用されないため、シリアル化メカニズムとしてだけでなく、メディアタイプの問題を処理するためにあります)。

于 2012-06-07T15:04:04.957 に答える