2016-02-24 8 views
11

मैं DI के लिए डैगर 2 का उपयोग करने की कोशिश कर रहा हूं, यह गतिविधि/फ्रैगमेंट से संबंधित कक्षाओं के लिए बिल्कुल ठीक काम करता है जहां एक क्रिएट लाइफसाइक्ल इवेंट है। अब मेरे पास एक सादा जावा क्लास है जिसे मैं इंजेक्शन देना चाहता हूं। इस बारे में कोई विचार है कि इसके बारे में कैसे जाना है इसकी सराहना की जाएगी। कोड मैं इस तरह दिखता है:गैर गतिविधि में डैगर 2 इंजेक्शन जावा क्लास

BasicMoviesUsecaseComponent.java -

@PerActivity 
@Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class) 
public interface BasicMoviesUsecasesComponent { 
    void inject(PaymentsManager paymentsManager); 
} 

DatabaseModule.java -

@Module 
    public class DatabaseModule { 
     @Provides @Singleton 
     Realm provideRealmInstance(Context context) { 

      return Realm.getInstance(context); 
     } 

     @Provides @Singleton 
     DatabaseProvider provideDatabaseInstance(Realm realm) { 

      return new DatabaseProvider(realm); 
     } 

     @Provides @Singleton 
     SharedPreferences provideSharedPrefs(Context context) { 

      return context.getSharedPreferences(context.getPackageName()+"_prefs", Context.MODE_PRIVATE); 
     } 

     @Provides @Singleton 
     SharedPreferencesManager provideSharedPreferencesManager(SharedPreferences sharedPreferences) { 
      return new SharedPreferencesManager(sharedPreferences); 
     } 

     @Provides @Singleton 
     PaymentsManager providePaymentsManager(SharedPreferencesManager sharedPreferencesManager) { 

       return new PaymentsManager(sharedPreferencesManager); 

     } 

} 

AppComponent.java -

@Singleton 
    @Component(modules = { 
    ApplicationModule.class, 
    DomainModule.class, 
    DatabaseModule.class 
    }) 

public interface AppComponent { 

    Bus bus(); 
    Realm realm(); 
    DatabaseProvider dbProvider(); 
    SharedPreferencesManager sharedPreferencesManager(); 
} 

यहाँ है वर्ग मैं SharePreferences प्रबंधक को इंजेक्ट करने की आवश्यकता है और मैं ऐसा करने में असमर्थ हूं:

MyManager.java -

private class MyManager { 
    private SharedPreferencesManager manager; 

    @Inject 
    MyManager(SharedPreferencesManager manager){ 
      this.manager = manager;   
    } 

    private void initializeDependencyInjector() { 

      BMSApplication app = BMSApplication.getInstance(); 

      DaggerBasicMoviesUsecasesComponent.builder() 
       .appComponent(app.getAppComponent()) 
       .basicMoviesUsecasesModule(new BasicMoviesUsecasesModule()) 
       .build().inject(PaymentsManager.this); 
    } 

} 

मैं कैसे initializeDependencyInjector (कहते हैं)?

उत्तर

28

आपको जब भी संभव हो तो कन्स्ट्रक्टर इंजेक्शन का उपयोग करना चाहिए। component.inject(myObject) पर कॉल का उपयोग उन वस्तुओं के लिए किया जाता है जिन्हें आप स्वयं को चालू नहीं कर सकते (जैसे गतिविधियों या टुकड़े)।

निर्माता इंजेक्शन मूल रूप से है क्या आप पहले से ही किया था:

private class MyManager { 
    private SharedPreferencesManager manager; 

    @Inject 
    MyManager(SharedPreferencesManager manager){ 
      this.manager = manager;   
    } 
} 

डैगर आप के लिए वस्तु बनाने और अपने SharedPreferencesManager में पारित करेंगे। इनिट या कुछ समान कॉल करने की कोई आवश्यकता नहीं है।

असली सवाल यह है कि MyManager का ऑब्जेक्ट कैसे प्राप्त करें। ऐसा करने के लिए, फिर, डैगर इसे आपके लिए संभाल लेंगे।

@Inject के साथ कन्स्ट्रक्टर को एनोटेट करके आप डगर को बताते हैं कि यह उस प्रकार का ऑब्जेक्ट कैसे बना सकता है। इसका उपयोग करने के लिए, बस इसे इंजेक्ट करें या इसे निर्भरता के रूप में घोषित करें।

private class MyActivity extends Activity { 
    @Inject 
    MyManager manager; 

    public void onCreate(Bundle savedState){ 
     component.inject(this); 
    } 
} 

या सिर्फ एक घटक के लिए एक गेटर जोड़ने (जब तक SharedPreferenceManager प्रदान किया जा सकता, MyManager भी instantiated जा सकता है):

@Component(dependencies = SharedPreferenceManagerProvidingComponent.class) 
public interface MyComponent { 

    MyManager getMyManager(); 
} 
+0

बहुत बहुत शुक्रिया, एक आकर्षण की तरह काम किया! –

+0

मदद के लिए धन्यवाद। यह वास्तव में मदद करता है। –

+0

इस निर्भरता को 'साझाकरण प्रबंधक प्रबंधक प्रबंधक' कैसे पूरा किया जाएगा? –

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