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

Dagger2 module: how to obtain context to pass to the constructor of a class I want to provide

第一次使用Dagger2

在我的 android 应用程序中,我有一个扩展应用程序的 MyApplication class。 我还有一个 ImageAssistant class,它是相关图像处理方法的集合。 在我的 MyApplicaiton class 中,我曾经为所有要使用的活动实例化一个 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();

}

您的模块应如下所示:

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

}

不要忘记在 Application class 中初始化 ObjectGraph。我使用 SharedObjectGraph static class 在整个应用程序中共享从 AppModule 创建的 ObjectGraph

阅读 building the graph 部分。

我做了这样的事情:

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

在我的应用程序中 class:

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