2012-06-06 4 views
0

OpenRasta 서비스가 있으며 미디어 유형을 사용하여 리소스를 버전 화하고자합니다. 우리는 네임 스페이스로 구분할 수있는 새로운 버전마다 다른 DTO 세트를 갖게 될 것입니다. DTO의 각 버전마다 해당 미디어 유형이 있습니다.OpenRasta : 리소스를 적절하게 버전 지정하기 위해 제네릭 처리기를 사용할 수 있습니까?

은 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))); 

지금 당장은 내 서비스가 GET 요청의 Accept 헤더와 상관없이 MyResourceHandler<Dto.V1.MyResource>으로 요청을 처리하고있는 것처럼 보입니다.

의견이 있으십니까? accept 헤더를 사용하는 대신 /v1/MyResource/과 같은 URI를 사용하도록 스키마를 변경할 수 있지만이 방법을 사용하는 것이 좋습니다.

편집 : 나는 우리가 버전을위한 미디어 유형을 사용하는 이유의 일부를 추가이 아니라 공개 웹에 액세스 할 수 의미 내부 사용을위한 서비스이기 때문입니다해야 .

답변

1

동일한 URI에 두 개의 자원 유형을 등록하고 있는데 하나만 선택됩니다. 요청시 구분할 수있는 방법이 없습니다.

URI 나 미디어 유형의 버전 관리가 웹에서 좋은 생각이라고 생각하지 않습니다. 즉, 원하는 미디어 유형에 따라 동일한 리소스 유형을 사용하고 코덱을 사용하여 수신/송신 데이터와 동일한 유형을 채 웁니다. DTO와 미디어 형식 형식을 연결하는 OR 코덱의 책임입니다.

들어오는 요청에서 우리는 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) {} 
} 

를 쓸 수 및 문제가 해결됩니다 : 당신이 할 경우가 너무 일 것이다 다음을 말했다. 당신이 할 수없는 일은 OR이 대부분의 경우에 하나의 리소스 유형 == 하나의 URI를 가정하기 때문에 get을 구현하는 것입니다.

IoC 컨테이너를 사용하는 경우 일반적으로 typeof (Handler <>)와 함께 일반 형식 (등록자 typeof (IHandler <>))으로 핸들러를 등록 할 수 있습니다. 즉, IHandler가 처리기로 처리됩니다. 그러면 HandledBy>()를 등록에 등록하면 완료됩니다. 코덱에도 똑같이 적용됩니다. (다시 말하지만, OR의 코덱은 직렬화 메커니즘 자체뿐만 아니라 직렬화 자체가 웹용으로 악용되어 거의 사용되지 않아야하므로 미디어 유형 문제를 처리해야합니다.)

+0

감사합니다. 필자는 직렬화가 웹에서 악하다고 생각하는 이유에 대해 더 많이 듣고 싶습니다. –

+0

미디어 유형에 의존하지 않고 버전 관리를 위해 URI를 사용한다면 원하는 것 (대부분의 경우 일반, 처리기 및 리소스의 여러 버전 용 코덱)을 얻을 수있는 것처럼 들립니다. 그렇다면 아마도 그 길로 갈 것입니다. –

+0

당신은 자원의 식별을 깨뜨리기 때문에 그것은 끔찍할 것입니다. 나는 당신이 모든 동일한 결과를 얻었지만 시간이 지남에 따라 당신의 URI를 일관성있게 유지하면서 그 솔루션을 통해 나의 해결책을 강력히 추천 할 것이다. 뭔가 URI가 버전 관리를 향해 갈 수있는 내 솔루션에 누락되었습니다. – SerialSeb