匕首依赖注射

时间:2014-09-22 04:55:03

标签: java android dependency-injection sharedpreferences dagger

实际上我是依赖注射和匕首的新手,我一直在写锅炉板代码而且我正在努力学习匕首

我有一个保存偏好值的全局类

@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();
    } 
}

我怎么可能在My活动中注入这个课程 在我的活动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);   
    }

但是我应该如何将依赖关系,即上下文和首选项名称传递给AppPrefes类,我对依赖注入是全新的,如果我错了请纠正我 因为匕首文档对我来说似乎有点难以提出这个问题。

1 个答案:

答案 0 :(得分: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());
    }
}

之后,您可以创建一个Dagger模块,该模块可以提供Application实例的Context。

@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在活动中注入此内容,但是您需要提供要作为构造函数参数注入的String,如下所示:https://stackoverflow.com/a/18105271/2413303

我的模块和内容的结构就像这里:How to set up DAGGER dependency injection from scratch in Android project?