2013-07-30 17 views
1

我正在構建一個支持鏈接資源擴展的ReST API,並且我無法弄清楚如何使用ServiceStack的本地綁定功能將URL轉換爲填充的「請求DTO」對象。如何使用ServiceStack將href轉換爲RequestDto?

例如,說我的API允許你使用這個請求檢索有關頻帶的信息:

GET /bands/123 

< 200 OK 
< Content-Type: application/json 
{ 
    "href": "/bands/123", 
    "name": "Van Halen", 
    "genre": "Rock", 
    "albums" { 
     "href" : "/bands/1/albums", 
    } 
} 

如果你想擴大樂隊的專輯列表,你可以這樣做:

GET /bands/1?expand=albums 

< 200 OK 
< Content-Type: application/json 
{ 
    "href": "/bands/123", 
    "name": "Van Halen", 
    "genre": "Rock", 
    "albums" { 
     "href" : "/bands/1/albums", 
     "items": [ 
      { "href" : "/bands/1/albums/17892" }, 
      { "href" : "/bands/1/albums/28971" } 
     ] 
    } 
} 

我正在使用ServiceStack,我想通過重新使用現有的服務方法來執行此內聯擴展。

我ServiceStack響應的DTO是這樣的:

public class BandDto { 
    public string Href { get; set; } 
    public string Name { get; set; } 
    public AlbumListDto Albums { get; set; } 
} 

public class AlbumListDto { 
    public string Href { get; set; } 
    public IList<AlbumDto> Items { get; set;} 
} 

public class AlbumDto { 
    public string Href { get; set; } 
    public string Name { get; set; } 
    public int ReleaseYear { get; set; } 
} 

我ServiceStack請求/路由對象是這樣的:

[Route("/bands/{BandId}", "GET")] 
public class Band : IReturn<BandDto> { 
    public string Expand { get; set; } 
    public int BandId { get; set; } 
} 

[Route("/bands/{BandId}/albums", "GET")] 
public class BandAlbums : IReturn<AlbumListDto> { 
    public int BandId { get; set; } 
} 

和處理請求的實際服務是這樣的:

public class BandAlbumService : Service { 
    public object Get(BandAlbums request) { 
     return(musicDb.GetAlbumsByBand(request.BandId)); 
    } 
} 


public class BandService : Service { 

    private IMusicDatabase db; 
    private BandAlbumService bandAlbumService; 

    public BandService(IMusicDatabase musicDb, BandAlbumService bandAlbumService) { 
     this.db = musicDb; 
     this.bandAlbumService = bandAlbumService; 
    } 

    public object Get(Band request) { 
     var result = musicDb.GetBand(request.BandId); 

     if (request.Expand.Contains("albums")) { 
      // OK, I already have the string /bands/123/albums 
      // How do I translate this into a BandAlbums object 
      // so I can just invoke BandAlbumService.Get(albums) 

      var albumsRequest = Translate(result.Albums.Href); 
      result.Albums = bandAlbumService.Get(albumsRequest); 
    } 
} 

在上面的例子中,假設我計算了字符串/bands/123/albums作爲Van Halen專輯列表的HREF。

如何使用ServiceStack的內置綁定功能將字符串/bands/123/albums轉換爲BandAlbums'request'對象,我可以直接將其傳遞到BandAlbumService中,取回填充的BandAlbumsDto對象並將其包含在我的響應對象中?

(是的,我知道這可能不是在減少數據庫的訪問我會擔心,後來方面的最佳做法。)

回答

2

RestPath應該能夠幫助你:

我認爲這應該工作:

var restPath = EndpointHostConfig.Instance.Metadata.Routes.RestPaths.Single(x => x.RequestType == typeof(AlbumRequest)); 
var request = restPath.CreateRequest("/bands/123/albums") 
+0

精美的作品 - 謝謝:)注意,你需要真正的實例化和初始化API主機能夠單元測試中做到這一點。 –

相關問題