如何在非Activity类中注入Context?

3

我正在尝试在非Activity类中注入Context。在我的情况下,我正在尝试在Model类(MVP模式)中进行注入。我需要Context来从资源中获取字符串。方法result()返回Observable,该返回值返回修改后的API模型的ViewModel。ViewModel用于在MainActivity中显示。我尝试了这段代码,但是Context为null,我认为它没有被注入。

public class MainActivityModel implements MainActivityMVP.Model {

@Inject
Context context;

private Repository repository;

public MainActivityModel(Repository repository) {

    ((App) getApplication()).getComponent().inject(this); //Cannot resolve getApplication() method :(
    this.repository = repository;

}

@Override
public Observable<List<ViewModel>> result(String username) {

    return repository.getRepositories(username).map(new Func1<List<Repository>, List<ViewModel>>() {
        @Override
        public List<ViewModel> call(List<Repository> repositories) {

            List<ViewModel> viewModelList = new ArrayList<ViewModel>();
            for (Repository repository : repositories) {
                // here Context is null
                viewModelList.add(new ViewModel(context.getString(R.string.repository) + repository.getName()));
            }

            return viewModelList;

        }
    });

}

这是一个组件类,其中有一个inject(MainActivityModel target)方法,但我无法使用它来注入MainActivityModel,因为非Activity类中不可用getApplication:

@Singleton
@Component(modules = {ApplicationModule.class, MainActivityModule.class, GithubApiModule.class})
public interface ApplicationComponent {

    void inject(MainActivity target);
    void inject(MainActivityModel target);

}

我认为可以通过result(String username, Context context)方法发送上下文(Context)。但是如果我将Context作为方法参数传递,那么依赖注入(Dependency Injection)的意义是什么呢?也许我误解了DI的基本概念。

因此,我的问题是:是否可能在非活动类中注入Context?还是应该将其作为方法参数传递?

1个回答

0
为了注入一个上下文,您需要编写一个包含 provides 方法的模块:
@Module (injects = {MainActivityModel.class})
    public class RootModule {
    private Context context;

    public RootModule(App application) {
        this.context = application.getApplicationContext();
    }

    @Provides
    @Singleton
    Context provideContext() {
        return context;
    }
}

在你的自定义 App 类中:
public class App extends Application {
    public ObjectGraph objectGraph;

    @Override
    public void onCreate() {
        super.onCreate();
        objectGraph = ObjectGraph.create(getInjectionModule());
    } 

    protected Object getInjectionModule() {
        return new RootModule(this);
    }
}

并在模型的构造函数中注入:

public MainActivityModel(Repository repository) {

    ((App) getApplication()).objectGraph.inject(this); 
    this.repository = repository;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接