2012-12-16 12 views
5

Po prostu zaczynam uczyć się REST i ServiceStack i jest coś o Route, którego po prostu nie mogę zrozumieć. Na przykład, jeśli weźmiemy bardzo prosty przykład HelloWorld z samouczka GitHub i ponownie go zapiszemy, aby zwrócić kolekcję obiektów User. Oto przykład:REST Routing w ServiceStack

public User 
{ 
    public string Name; 
    public string Address; 
    public int Age; 
} 


// Hello - request object without [Route] attribute 
public class Hello 
{ 
    public string Name { get; set; } 
} 

public class HelloResponse 
{ 
    public IEnumerable<User> Result {get;set;} 
} 


public class HelloService : Service 
{ 
    public object Any(Hello request) 
    { 
     return new HelloResponse { // Collection of User object }; 
    } 
} 

teraz wszystko działa poprawnie i bez problemów tutaj. Ale teraz chcę dodać kolejny adres URL routingu jak: /Hello/{name}/Address

Właściwie rozmowy (GET) do tej url wróci jeden User wybrany przez Age parametru. Jak mogę to zrobić? Czy powinienem dodać kolejny Service? A jeśli url będą:

/Hello/{name}/{age}/Address

Wydaje mi czegoś nie rozumiesz .....

Odpowiedz

3

Zobacz tę wcześniejszą odpowiedź o szczegóły Routing in ServiceStack. Sekcja Inteligentne wyznaczanie trasy w dokumencie ServiceStack's New API objaśnia dalsze opcje i różne priorytety.

Jest kilka problemów z twoim przykładem. Pierwsze serializers tekstowe ServiceStack obsługuje tylko właściwości publiczne więc trzeba zmienić model użytkownika, aby korzystać z publicznych właściwości zamiast dziedzinach, np:

public User 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public int Age { get; set; } 
} 

Dalej, Interfaces on DTOs are a bad idea jak nie ma dobry powód. Nadal są obsługiwane, ale możesz uzyskać niepożądane wyniki. Użyj konkretny zbiór niczym List<T> który zapewnia większą użyteczność, np

public class HelloResponse 
{ 
    public List<User> Results { get; set; } 
} 

Również trasy powinien pasować nazwy własności na swoim DTO dokładnie, są wielkości liter podczas dopasowywania przeciwko ścieżce żądania, ale muszą odwzorować na dokładną nazwę nieruchomości, np .:

/Hello/{Name}/{Age}/Address 
+0

Dzięki za odpowiedź, ale wydaje mi się, że źle rozumiem funkcję 'Route.Add'. Proszę mnie poprawić, jeśli się mylę! Schemat dla 'Route.Add' to: Route.Add ("//{DTO-field-name}/{DTO-field-name} "). Po stronie klienta jest serializowany do pełnego obiektu DTO z polami ustawionymi jak w url i deserialized na serwerze w funkcji, która ma parametry typu DTO i rzeczywistego czasownika HTML (POST/GET)? Czy to na ogół jest poprawne? – Jasper

+0

Parametry 'Route.Add ()' i '[Route]' są dokładnie takie same. tj. obaj stosują się do wniosku DTO, ale sama trasa może być dowolnym tekstem, który chcesz dopasować. Zmienne na Route muszą być odwzorowane na pola Request DTO. – mythz