我正在構建一個支持鏈接資源擴展的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對象並將其包含在我的響應對象中?
(是的,我知道這可能不是在減少數據庫的訪問我會擔心,後來方面的最佳做法。)
精美的作品 - 謝謝:)注意,你需要真正的實例化和初始化API主機能夠單元測試中做到這一點。 –