2011-02-02 13 views
14

मैं सोच रहा था कि Grails पर एक सेवा इंटरफ़ेस बनाना संभव है और मुझे इसे करने का उचित तरीका नहीं मिल रहा है। इस विवरण, संतोषजनक नहीं है, क्योंकि यह मिश्रण करने लगता है जावा और ग्रूवी:Grails सेवाओं में कार्यान्वयन से इंटरफेस को अलग कैसे करें?

http://www.grails.org/doc/latest/guide/8.%20The%20Service%20Layer.html

यह ढांचे के एक बुरा डिजाइन दोष, यह देखते हुए की तरह मुझे लगता है कि इंटरफेस तंत्र बेहतरीन सुविधाओं में से एक है जावा (और अधिकतर ओओ भाषाएं)।

इस मुद्दे को स्पष्ट करने के लिए कोई विचार?

धन्यवाद! Mulone

+3

'src' में इंटरफ़ेस बनाने और इसे सेवा में कार्यान्वित करने में क्या समस्या है? या आप फ्लाई पर सेवा कार्यान्वयन को प्रतिस्थापित करने में सक्षम होना चाहते हैं? प्रतिनिधियों (http://groovy.codehaus.org/Replace+Inheritance+with+Delegation) मदद करेगा। –

उत्तर

5
  • एक वर्ग com.mycompany.mypackage.MyInterface.groovy संग्रहीत under src/groovy
  • में grails-app/services

    class MyService implements MyInterface { 
        // service implementation goes here 
    } 
    
+0

लेकिन इस मामले में मैं नियंत्रक "def myInterface" में निर्दिष्ट कर सकता हूं? इंजेक्शन कैसे काम करेगा? – Mulone

+0

नहीं, आप 'def myService' घोषित करेंगे –

+0

निर्भरता इंजेक्शन कैसे पता चल जाएगा कि आप अपने नियंत्रक में किस कार्यान्वयन को इंजेक्शन देना चाहते हैं? जैसे tim_yates कहते हैं, आपको इसे नाम देकर, इसे बताना होगा। रनटाइम के दौरान आप अपने इंटरफ़ेस को कार्यान्वित करने के लिए एक और बीन संदर्भ ले सकते हैं और इसे मेरे सेवा में असाइन कर सकते हैं, और इस प्रकार एक ही मेथोड उपलब्ध हो सकते हैं। – sbglasius

1

इसकी नहीं एक डिजाइन दोष के तहत संग्रहीत सेवा कार्यान्वयन सेवा इंटरफ़ेस परिभाषित परिभाषित करते हैं। ग्रोवी जावा से अलग है जिसमें यह एक गतिशील भाषा है जो 'बतख-टाइपिंग' का उपयोग करती है। ग्रोवी में दिलचस्प क्या है कि इंटरफेस भी हैं। तो यदि आप @ डॉन के सुझाव का पालन करते हैं, तो आप यह सुनिश्चित कर सकते हैं कि आपकी सेवा इंटरफ़ेस के अनुरूप है, लेकिन जिस तरह से आप grails के साथ DI करते हैं, वह केवल सेवा कार्यान्वयन निर्दिष्ट करना है। यानी आप संकलन समय की जांच नहीं करते जहां आप सेवा कार्यान्वयन का उपयोग करते हैं, जैसे आप जावा में करते हैं।

ध्यान दें कि यहां कोई तंग युग्मन नहीं है। युग्मन का तात्पर्य है कि कुछ प्रकार के लिए बाध्य है। लेकिन ग्रोवी के ढीले टाइपिंग सिस्टम के साथ, प्रकार अनिवार्य रूप से गतिशील जीव हैं। तो जावा में, यदि आप एक विशिष्ट कार्यान्वयन के लिए एक प्रकार घोषित करते हैं, तो कोड बाद में बदलते समय कोड संकलित नहीं हो सकता है। ग्रोवी में, यदि आप 'def' का उपयोग करते हैं तो कोड हमेशा संकलित होगा ... (मुझे लगता है कि यह सही है)

17

आपके पास एक इंटरफ़ेस हो सकता है, लेकिन वास्तव में आपको एक की आवश्यकता नहीं है। अगर मैं आपको सही ढंग से समझता हूं तो आप एक सेवा के दो कार्यान्वयन करना चाहते हैं और यह चुनने में सक्षम होना चाहिए कि किस का उपयोग करना है।

सीधे शब्दों में, उदाहरण के MyService1 और MyService2 के लिए नामित दो सेवाओं को लागू तो grails-app/conf/spring/resource.groovy में आपके द्वारा निर्दिष्ट कर सकते हैं:

beans = { 
    ... 
    // syntax is beanId(implementingClassName) { properties } 
    myService(MyService1) 
    ... 
} 

या यहाँ तक कि:

beans = { 
    ... 
    if (someConfigurationOption) { 
     myService(MyService1) 
    } else { 
     myService(MyService2) 
    } 
} 

इस तरह आप स्प्रिंग बताओ जो सेवा वास्तव में इंजेक्षन करने के लिए है myService के लिए।

public MyController { 
    def myService 
    ... 
} 

और स्प्रिंग ऑटो तार होगा एक उचित कार्यान्वयन: अब आप का उपयोग करने के myService तरह सक्षम हो जाएगा। यह आपको कुछ कॉन्फ़िगरेशन पर उदाहरण के आधार पर उपयोग करने के लिए कौन से सेवा कार्यान्वयन को कॉन्फ़िगर करने की अनुमति देता है।

0

इसके लिए मैंने पाया सबसे अच्छा समाधान वसंत बीन उपनाम का उपयोग कर रहा है।मूल रूप से आप की जरूरत है:

1) एक अंतरफलक बनाएं src/ग्रूवी (MyService.groovy)

2) आपकी सेवा सम्मिलित करें आपको उपलब्ध हो जाए में:

class MyController { 
    MyService myService 
} 

3) कि लागू करने के लिए अपने नियमित सेवाएं बनाएं इंटरफ़ेस (ImplOneService.groovy, ImplTwoService.groovy)

4) संसाधन.groovy में एक प्रविष्टि जोड़ें जहां आप परिभाषित करने के लिए किस कार्यान्वयन को परिभाषित करते हैं (अंततः, पर्यावरण के लिए परीक्षण, या आपको जो भी चाहिए):

beans = { 
    if (...development, useFTP, etc...) { 
     springConfig.addAlias 'myService', 'ImplOneService' 
    } else { 
     springConfig.addAlias 'myService', 'ImplTwoService' 
    } 
} 

Complete sources here

मेरे टिप्पणियाँ: ग्रूवी में इंटरफेस का उपयोग करना वास्तव में की "मैं कुछ जावा सामान मैं के साथ अधिक सहज कर रहा हूँ के साथ रहना चाहते हैं" किसी तरह की तरह लगता है। इस मामले में, मजबूत टाइपिंग। लेकिन यह वास्तव में ग्रोवी का अच्छा हिस्सा है "कोई चिंता नहीं, अगर आप चाहते हैं तो आप जावा रास्ता रख सकते हैं"।

संबंधित मुद्दे