2012-12-16 21 views
5

मैं बस आरईएसटी और सर्विसस्टैक सीखना शुरू करता हूं और Route के बारे में कुछ है जो मैं समझ नहीं पा रहा हूं। उदाहरण के लिए यदि हम गिटहब ट्यूटोरियल से बहुत ही बुनियादी हैलोवर्ल्ड उदाहरण लेते हैं और User ऑब्जेक्ट्स के संग्रह को वापस करने के लिए इसे फिर से लिखते हैं। यहां उदाहरण है:सर्विसस्टैक में REST रूटिंग

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 }; 
    } 
} 

अब सब ठीक काम कर रहे हैं और यहां कोई समस्या नहीं है। /Hello/{name}/Address

वास्तव में इस कॉल (जीईटी) इस यूआरएल के लिए एक एकल UserAge पैरामीटर द्वारा चयनित वापस आ जाएगी: लेकिन अब मैं की तरह एक और मार्ग यूआरएल जोड़ना चाहते हैं। मैं यह कैसे कर सकता हूं ? क्या मुझे एक और Service जोड़ना चाहिए? और अगर यूआरएल होगा:

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

ऐसा लगता है कि मैं कुछ समझ में नहीं आता .....

उत्तर

3

Routing in ServiceStack के बारे में जानकारी के लिए इस पहले उत्तर देखें। ServiceStack's New API में स्मार्ट रूटिंग अनुभाग और विकल्प और विभिन्न प्राथमिकता बताता है।

आपके उदाहरण के साथ कुछ समस्याएं हैं। सबसे पहले ServiceStack पाठ serializers केवल सार्वजनिक गुण तो आप अपने उपयोगकर्ता मॉडल बदलने के लिए क्षेत्रों के बजाय सार्वजनिक गुणों का उपयोग करने की आवश्यकता है, उदा समर्थन करते हैं:

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

इसके बाद, Interfaces on DTOs are a bad idea के रूप में इसके लिए कोई अच्छा कारण नहीं है। वे अभी भी समर्थित हैं लेकिन आप अवांछित परिणामों के साथ समाप्त कर सकते हैं। एक List<T> जो अधिक उपयोगिता प्रदान करता है की तरह एक ठोस संग्रह, जैसे का उपयोग करें:

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

इसके अलावा मार्गों अपने डीटीओ बिल्कुल पर संपत्ति के नाम से मेल खाना चाहिए, वे केस-संवेदी जब अनुरोध पथ के खिलाफ मिलान कर रहे हैं, लेकिन उन्हें एक सटीक संपत्ति के नाम पर नक्शा लगाने की आवश्यकता है, उदाहरण के लिए:

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

एन्सवेयर के लिए धन्यवाद लेकिन ऐसा लगता है कि मैं 'रूट। जोड़ें' फ़ंक्शन को गलत समझता हूं। अगर मैं गलत हूं तो कृपया मुझे सही करें! 'रूट.एड'' के लिए स्कीमा है: रूट। जोड़ें <अनुरोध-डीटीओ-ऑब्जेक्ट-टाइप-इयर> ("/ <डीटीओ-ऑब्जेक्ट-नेम>/{डीटीओ-फील्ड-नेम}/{डीटीओ-फ़ील्ड-नेम} ")। क्लाइंट साइड पर यह पूर्ण डीटीओ ऑब्जेक्ट को क्रमशः यूआरएल में सेट किए गए फ़ील्ड के साथ क्रमबद्ध किया गया है और फंक्शन में सर्वर पर deserialized है जिसमें डीटीओ प्रकार और वास्तविक HTML क्रिया (POST/GET) के रूप में पैरामीटर है? क्या यह आम तौर पर सही है? – Jasper

+0

'मार्ग। ()' और '[रूट] 'विशेषता जोड़ें बिल्कुल वही हैं। यानी वे दोनों एक अनुरोध डीटीओ पर आवेदन करते हैं लेकिन मार्ग स्वयं ही कोई टेक्स्ट शाब्दिक हो सकता है जिसे आप मिलान करना चाहते हैं। रूट में चर को अनुरोध डीटीओ फ़ील्ड में मैप करने की आवश्यकता है। – mythz