2013-03-15 6 views
5

मैं प्ले फ्रेमवर्क और स्कैला में नया हूं और मैं एक साथी ऑब्जेक्ट के अंदर निर्भरता इंजेक्ट करने की कोशिश कर रहा हूं। की तरह एक साथी वस्तु के साथकिसी ऑब्जेक्ट के अंदर निर्भरता इंजेक्ट करें

case class Bar(foo: Int) {} 

:

मैं की तरह एक साधारण मामला वर्ग है,

object Bar { 
    val myDependency = 
    if (isTest) { 
    // Mock 
    } 
    else 
    { 
    // Actual implementation 
    } 

    val form = Form(mapping(
    "foo" -> number(0, 100).verifying(foo => myDependency.validate(foo)), 
)(Bar.apply)(Bar.unapply)) 
} 

यह ठीक काम करता है, लेकिन यह वास्तव में यह करने के लिए एक साफ रास्ता नहीं है। मैं निर्माण समय पर निर्भरता को इंजेक्ट करने में सक्षम होना चाहता हूं ताकि परीक्षण और उत्पादन में परीक्षण और विभिन्न वास्तविक कार्यान्वयन के दौरान मैं विभिन्न नकली वस्तुओं को इंजेक्ट कर सकूं।

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है?

किसी भी मदद की वास्तव में सराहना की। धन्यवाद!

+0

मुझे लगता है कि कोशिश कर सकते हैं आपको जो चाहिए वह एक तथाकथित "केक पैटर्न" है। डैनियल स्पिवाक द्वारा एक ब्लॉग पोस्ट था, लेकिन मुझे यह प्रतीत नहीं होता है। लेकिन यह (http://www.warski.org/blog/2011/04/di-in-scala-cake-pattern-pros-cons/) संदर्भ के रूप में अच्छा होना चाहिए। – MisterMetaphor

+1

यह [मूल पोस्ट] है (http://jonasboner.com/2008/10/06/real-world-scala- निर्भरता- इंजेक्शन-di/) जोनास बोनर –

उत्तर

0

केक की पंक्तियों के साथ, हम

trait Validator { 
    def validate(foo: Int): Boolean 
} 

trait TestValidation { 
    val validator = new Validator { 
     def validate(foo: Int): Boolean = ... 
    } 
} 

trait ImplValidation { 
    val validator = new Validator { 
     def validate(foo: Int): Boolean = ... 
    } 
} 


trait BarBehavior { 
    def validator: Validator 

    val form = Form(mapping(...))(Bar.apply)(Bar.unapply) 
} 

//use this in your tests 
object TestBar extends BarBehavior with TestValidation 

//use this in production 
object ImplBar extends BarBehavior with ImplValidation 

करने के लिए अपने उदाहरण को बदलने के लिए आप अतिरिक्त कोशिश करते हैं और परीक्षण करना चाहिए अगर इस उदाहरण प्ले ढांचे के भीतर अच्छी तरह से फिट बैठता है, भी

+0

धन्यवाद, @ pagoda_5b। मुझे ऑब्जेक्ट बार में एक त्रुटि मिलती है "केवल कक्षाएं घोषित हो सकती हैं लेकिन अनिर्धारित सदस्य" – satoshi

+0

भी "निर्दिष्ट मूल्य पैरामीटर: foo: Int" जहां मैं लिखता हूं 'ऑब्जेक्ट इम्प्लबार आईपीएल वैलिडेशन के साथ बार बढ़ाता है' (जहां 'foo: Int' है बार की केवल विशेषता) – satoshi

+0

मैंने बेस बार व्यवहार के लिए सही तरीके से उपयोग करने के लिए कोड अपडेट किया है, लेकिन मुझे लगता है कि यह बार में एक साथी ऑब्जेक्ट को परिभाषित करने की आपकी आवश्यकता के साथ ठीक नहीं है ... मैं और विस्तार से बताऊंगा –

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