2013-02-25 44 views
5

पर एक सेव विधि जोड़ने के लिए अच्छा रखरखाव तरीका मैं github पर नमूना पालतू क्लिनिक grails ऐप देख रहा था।grails सेवा

यह PetclinicService जोड़ने पालतू जानवरों के लिए एक विधि है कि कहा जाता है पालतू बनाने के लिए एक सेवा है:

Pet createPet(String name, Date birthDate, long petTypeId, long ownerId) { 
    def pet = new Pet(name: name, birthDate: birthDate, type: PetType.load(petTypeId), owner: Owner.load(ownerId)) 
    pet.save() 
    pet 
} 

जो इतनी तरह नियंत्रक से किया जा रहा है:

def pet = petclinicService.createPet(params.pet?.name, params.pet?.birthDate, 
    (params.pet?.type?.id ?: 0) as Long, (params.pet?.owner?.id ?: 0) as Long) 

मैं करने के लिए उत्सुक हूँ पता है कि क्या यह grails में कुछ बचाने के लिए सबसे अच्छा तरीका है? इस दृष्टिकोण के साथ यदि मैं Pet डोमेन में कोई अन्य फ़ील्ड जोड़ता हूं, तो String color कहें, तो मुझे पूरा होने के लिए तीन वर्ग (Pet, PetController, and PetclinicService) स्पर्श करना होगा।

क्या कोई तरीका है कि मैं पूरे params ऑब्जेक्ट को सेवा में भेज सकता हूं और क्या यह स्वचालित रूप से डोमेन पर मैप कर सकता है?

उत्तर

7

मुझे लगता है कि परिवर्तन किया है क्योंकि मानक params नक्शे में पारित करने के लिए है, लेकिन यह कुछ कारणों के लिए बुरा है। एक यह है कि यह वेब स्तर पर सेवा स्तर जोड़ता है। यह सख्त युग्मन नहीं है क्योंकि यह सिर्फ एक मानचित्र है, लेकिन सेवाओं को पुन: प्रयोज्य और स्वतंत्र होना चाहिए। दूसरा यह है कि नक्शा एक "जादू" मानचित्र है जहां आपको इसका उपयोग करने के लिए चाबियाँ जाननी होंगी। नामित और टाइप किए गए विधि तर्कों का उपयोग करके, कोड अधिक पठनीय और समझने योग्य है।

यह एक रखरखाव बोझ जोड़ता है क्योंकि आप एक नए क्षेत्र को जोड़ने के लिए हस्ताक्षर बदलने की आवश्यकता है, लेकिन आदर्श रूप से यह विधि एक ऐसा स्थान होगा जहां यह काम किया जाता है, इसलिए आपको इसे केवल एक ही स्थान पर बदलने की आवश्यकता है।

अपने कोड में params का उपयोग करने के लिए स्वतंत्र महसूस करें, लेकिन चूंकि यह परियोजना हमारी डेमो परियोजनाओं में से एक है, इसलिए मैं इसे संभवतः सर्वोत्तम प्रथाओं का उपयोग करना चाहता था।

+0

तो, सेवा के अंदर 'पैराम्स' मानचित्र का उपयोग कर खराब है अभ्यास? क्या यह नियंत्रक में 'पैराम्स' के साथ काम करने के लिए टेटर है? – havenchyk

1

आप सेवा करने के लिए पूरे params भेज सकते हैं, बस Map के रूप में घोषित:

Class PetclinicService { 
    Pet createPet(Map params) { 
    def pet = new Pet(params) 
    pet.save() 
    pet 
    } 
} 
+2

जब आप इस तरह अपना डेटा बाध्य करते हैं, तो याद रखें कि 'पैराम्स' उपयोगकर्ता इनपुट से आता है और इसमें उन गुणों को शामिल किया जा सकता है जिनकी आप अपेक्षा नहीं कर रहे हैं। Http://blog.springsource.org/2012/03/28/secure-data-binding-with-grails/ – ataylor

+0

दाएं, लिंक के लिए +1 :) –

2

पालतू क्लिनिक ऐप का उपयोग करने वाला पैटर्न एक बहुत अच्छा सर्वोत्तम अभ्यास है।

सेवा परत में params लीक करने से आपकी सेवाएं नियंत्रक परत के साथ अधिक कसकर मिल जाएंगी। सेवा का पुन: उपयोग करना, उदाहरण के लिए, एक एपीआई कठिन होगा। साथ ही, परीक्षण सरलीकृत किया गया है यदि आपकी सेवा विधियों के पास विधि पैरामीटर के रूप में एक स्पष्ट इंटरफ़ेस है।