2014-09-22 172 views
0

其實我是新來的依賴注入和匕首,我一直在寫鍋爐板代碼,所有的這些時間,我努力學習匕首匕首依賴注入

我有一個全球性的類來保存偏好值

@Module(injects = AppPrefes.class) 
public class AppPrefes { 

    private SharedPreferences appSharedPrefs; 
    private Editor prefsEditor; 

    public AppPrefes(Context context, String Preferncename) { 
     this.appSharedPrefs = context.getSharedPreferences(Preferncename, 
       Activity.MODE_PRIVATE); 
     this.prefsEditor = appSharedPrefs.edit(); 
    } 

    /**** 
    * 
    * getdata() get the value from the preference 
    * 
    * */ 
    @Provides 
    public String getData(String key) { 
     return appSharedPrefs.getString(key, ""); 
    }  

    /**** 
    * 
    * SaveData() save the value to the preference 
    * 
    * */ 
    @Provides 
    public void SaveData(String Tag, String text) { 
     prefsEditor.putString(Tag, text); 
     prefsEditor.commit(); 
    } 
} 

我怎麼可能在我的活動 注入這個類在我的活動OnCreate中我已經把這樣的

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ObjectGraph objectGraph = ObjectGraph.create(); 
     AppPrefes app = objectGraph.get(AppPrefes.class); 
    } 

但應該如何的ip屁股的依賴,即上下文和首選項名稱AppPrefes類,我完全新的依賴注入請糾正我,如果我錯了 由於匕首文件似乎是一點點難,我問這個問題。

回答

0

我相信,如果你願意承擔建立一個靜態變量來存儲應用程序的實例的風險,

public enum ApplicationHolder 
{ 
    INSTANCE; 

    private MyApplication application; 

    public MyApplication getApplication() 
    { 
     return application; 
    } 

    public void setApplication(MyApplication application) 
    { 
     this.application = application; 
    } 

} 

public MyApplication extends Application 
{ 
    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
     ApplicationHolder.INSTANCE.setApplication(this); 
     objectGraph.create(new RootModule()); 
    } 
} 

之後,你可以創建一個匕首模塊,可以提供應用程序上下文實例。

@Module(complete = false, library = true) 
public class ContextModule 
{ 
    @Provides 
    public Context providesContext() 
    { 
     return ApplicationHolder.INSTANCE.getApplication().getApplicationContext(); 
    } 
} 

@Module(
    includes = 
    { 
     ContextModule.class 
    }, 
    injects = 
    { 
     AppPrefes.class 
    } 
) 
public class RootModule 
{ 
} 

然後你就可以在@Inject您的活動注入這個,但是你需要提供要注入的構造函數的參數是這樣的Stringhttps://stackoverflow.com/a/18105271/2413303

模塊之類的東西對我來說,結構是像這裏:How to set up DAGGER dependency injection from scratch in Android project?