Dagger2模块:如何获取上下文以传递给我想要提供的类的构造函数

时间:2015-06-03 07:49:22

标签: java android dagger-2

第一次使用Dagger2。

在我的Android应用程序中,我有一个扩展Application的MyApplication类。 我还有一个ImageAssistant类,它是相关图像处理方法的集合。 在我的MyApplicaiton类中,我曾经为所有要使用的活动实例化ImageAssistant。

现在我正在尝试使用Dagger2,但我不知道如何在提供ImageAssistant的模块中传递上下文

这就是我的代码的样子:

public class ImageAssistant {

    Context context;

    public ImageAssistant(Context context){
        this.context = context;
    }


    // A bunch of methods...

}

public class MyApplication extends Application {

    public ImageAssistant imageAssistant;

    public void onCreate() {

        imageAssistant = new ImageAssistant(this);
    }

}

现在,输入Dagger 2,这就是我所拥有的

public class ImageAssistant {

    Context context;

    @Inject
    public ImageAssistant(Context context){
        this.context = context;
    }


    // A bunch of methods...

}

public class MyApplication extends Application {

    @Inject
    public ImageAssistant imageAssistant;

    public void onCreate() {


    }

}
包中的

.modules:

AppModule.java


@Module
public class AppModule {

    @Provides
    ImageAssistant provideImageAssistant() {
        return new ImageAssistant(); // HERE A CONTEXT IS NEEDED. WHERE TO GET IT FROM?
    }

}
编辑:这就是我的模块现在的样子,但我仍然不知道如何将所有内容组合在一起:

@Module
public class AppModule {

    private MyApplication application;

    public AppModule(MyApplication application) {
        this.application = application;
    }

    @Provides
    Context provideApplicationContext() {
        return this.application;
    }

    @Provides
    ImageAssistant provideImageAssistant(ImageAssistant imageAssistant) {
        return imageAssistant;
    }

}

这是AppComponent:

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {

    ImageAssistant provideImageAssistant();
    Context context();

}

2 个答案:

答案 0 :(得分:1)

您的模块应如下所示:

@Module(injects = {MainActivity.class})
public class AppModule {

    private MyApplication application;

    public AppModule(MyApplication application) {
        this.application = application;
    }

    @Provides
    public ImageAssistant provideImageAssistant() {
        return new ImageAssistantImpl(application); // implementation of ImageAssistant
    }

}

Activity中的用法:

public class MainActivity extends Activity{

@Inject
ImageAssistant imageAssistant;

@Override
protected void onCreate(Bundle savedInstanceState) {
    SharedObjectGraph.inject(this);
    imageAssistant.doSomething();
}

}

不要忘记在ObjectGraph课程中初始化Application。我使用SharedObjectGraph静态类在整个应用中共享从ObjectGraph创建的AppModule

阅读building the graph部分。

答案 1 :(得分:1)

我做了类似的事情:

@Module
public class ApplicationModule {

    private final SpendApplication app;

    public ApplicationModule(SpendApplication app) {
        this.app = app;
    }

    @Provides
    @Singleton
    public Context providesContext() {
        return app;
    }

}

@Module
public class GattManagerModule {

    @Provides
    @Singleton
    GattManager providesGattManager(Context context) {
        return new GattManager(context);
    }
}

并声明所有使用它的地方:

@Component(modules = { ApplicationModule.class, GattManagerModule.class, ...})
@Singleton
public interface ApplicationComponent {
    void inject(MainScreenActivity activity);
    ...
}

在我的应用程序类中:

@Override
public void onCreate() {
    super.onCreate();

    component = DaggerApplicationComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();

}

在我的MainActivity中:

@Inject
GattManager gattManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getAppComponent().inject(this);
}