2011-12-02 12 views
14

गुइस में, @ सिंगलेटन स्कोप सिंगलटन पैटर्न का संदर्भ नहीं देता है।गिइस - एकाधिक इंजेक्टर/मॉड्यूल के माध्यम से एक ही सिंगलटन इंस्टेंस को कैसे साझा करें

"Dhanji" के "निर्भरता इंजेक्शन" पुस्तक के अनुसार:

बहुत बस, एक सिंगलटन के संदर्भ इंजेक्टर ही है। का जीवन इंजेक्टर के जीवन से जुड़ा हुआ है (जैसा कि आंकड़ा 5.8 में है)। इसलिए, सिंगलटन का केवल एक उदाहरण प्रति इंजेक्टर प्रति बनाया गया है। इस अंतिम बिंदु पर जोर देना महत्वपूर्ण है, क्योंकि यह एक ही अनुप्रयोग में मौजूद कई इंजेक्टरों के लिए संभव है। में ऐसा परिदृश्य, प्रत्येक इंजेक्टर सिंगलटन-स्कोप्ड ऑब्जेक्ट का एक अलग उदाहरण रखेगा।

Singleton scope

यह कई मॉड्यूल और कई इंजेक्टर के माध्यम से एक ही सिंगलटन उदाहरण साझा करने के लिए संभव है?

उत्तर

21

आप उपयोग कर सकते हैं Injector.createChildInjector:

// bind shared singletons here 
Injector parent = Guice.createInjector(new MySharedSingletonsModule()); 
// create new injectors that share singletons 
Injector i1 = parent.createChildInjector(new MyModule1(), new MyModule2()); 
Injector i2 = parent.createChildInjector(new MyModule3(), new MyModule4()); 
// now injectors i1 and i2 share all the bindings of parent 
3

मैं क्यों आपको लगता है कि जरूरत नहीं दिख रहा है, लेकिन अगर आप वास्तव में चाहते हैं, तो संभव है:

package stackoverflow; 

import javax.inject.Inject; 
import javax.inject.Singleton; 

import junit.framework.Assert; 

import org.junit.Test; 

import com.google.inject.AbstractModule; 
import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.google.inject.Module; 

public class InjectorSingletonTest { 

    static class ModuleOne extends AbstractModule { 
     @Override 
     protected void configure() { 
      bind(MySingleton.class); 
     } 
    } 

    static class ModuleTwo extends AbstractModule { 
     final MySingleton singleton; 

     @Inject 
     ModuleTwo(MySingleton singleton){ 
      this.singleton = singleton; 
     } 

     @Override 
     protected void configure() { 
      bind(MySingleton.class).toInstance(singleton); 
     } 
    } 

    @Singleton 
    static class MySingleton { } 

    @Test 
    public void test(){ 
     Injector injectorOne = Guice.createInjector(new ModuleOne()); 

     Module moduleTwo = injectorOne.getInstance(ModuleTwo.class); 
     Injector injectorTwo = Guice.createInjector(moduleTwo); 

     MySingleton singletonFromInjectorOne = 
       injectorOne.getInstance(MySingleton.class); 

     MySingleton singletonFromInjectorTwo = 
       injectorTwo.getInstance(MySingleton.class); 

     Assert.assertSame(singletonFromInjectorOne, singletonFromInjectorTwo); 
    } 
} 
संबंधित मुद्दे