2014-09-22 130 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?