gpt4 book ai didi

java - 对服务的 Dagger 依赖项注入(inject)失败并显示 "contactServiceModule must be set at DaggerAppComponent$Builder.build(DaggerAppComponent.java)"

转载 作者:行者123 更新时间:2023-12-02 12:04:28 26 4
gpt4 key购买 nike

我正在使用 dagger 进行依赖注入(inject),我很抱歉没有深入研究并亲自实践:)我使用两个模块(ApplicationModule、ContactServiceModule)和一个组件(AppComponent)。我已经在 App.java 中初始化了 Dagger,并且尝试将依赖项注入(inject)到后台服务中。这是代码 fragment 。1)ApplicationModule.java

@Module
public class ApplicationModule {
private final App mApp;
private Service contactService;

public ApplicationModule(App app) {
mApp = app;
}

@Provides
@Singleton
public ContactModel contactModel(SQLiteDatabase database) {
return new ContactModel(mApp, database);
}

@Provides
@Singleton
public Context appContext() {
return mApp;
}

@Provides
@Singleton
public ContactController contactController() {
return new ContactController(mApp.getAppComponent());
}
//.....Some more code
}

2)ContactServiceModule.java

    @Module
public class ContactServiceModule {

ContactService contactService;

public ContactServiceModule(ContactService contactService){
this.contactService =contactService;
}

@Provides
@Singleton
ContactService provideContactService() {
return this.contactService;
}
}

3)AppComponent.java

 @Singleton
@Component(modules = {ApplicationModule.class,ContactServiceModule.class})
public interface AppComponent {


ContactController contactController();

Context appContext();
//...Some code
void inject(ContactController contactController);
//...Some code
void inject(ContactService contactService);
}

4)App.java

    public class App extends Application {
private AppComponent mAppComponent;
@Override
public void onCreate() {
super.onCreate();
FlowManager.init(this);
mAppComponent = DaggerAppComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}

public AppComponent getAppComponent() {
return mAppComponent;
}
}

5) ContactService.java

 public class ContactService extends Service {

@Inject
Context appContext;

@Inject
ContactController contactController;

@Override
public void onCreate() {
super.onCreate();
getAppComponent().inject(this);
}

private AppComponent getAppComponent() {
return ((App)getApplication()).getAppComponent();
}

}

这可能是注入(inject)后台服务的 UI 线程的依赖性问题。但我不明白应该如何实现将相同的依赖项注入(inject)到服务中。或者什么是应用程序级依赖项和服务之间通信的理想方式。我希望该服务始终在后台运行并监听各种 Intent ,并与其他依赖项(如 eventbus 等)进行通信。

最佳答案

错误信息:

contactServiceModule must be set at DaggerAppComponent$Builder.build(DaggerAppComponent.java)”

意味着您已经在构造函数中创建了一个具有依赖项的模块(ContactServiceModule 将您的 Service 作为构造函数中的参数)。因此,Dagger 2 无法自动实例化该模块,并且必须在创建组件时在构建器中实例化:

mAppComponent = DaggerAppComponent.builder()
.applicationModule(new ApplicationModule(this))
.contactServiceModule(contactService);
.build();

但是,您尝试创建的架构存在一个根本问题。服务(如 Activity)被设计为自治的并由 Android 操作系统实例化。就像您不会直接将 Activity 作为依赖项传递给另一个 Activity 一样,您也不应该将 Service 设为依赖项。相反,您需要使用 Intent、服务绑定(bind)或 EventBus 事件与服务进行通信。安卓 Service文档涵盖了这一点,您应该在继续之前仔细阅读它。

关于java - 对服务的 Dagger 依赖项注入(inject)失败并显示 "contactServiceModule must be set at DaggerAppComponent$Builder.build(DaggerAppComponent.java)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47001465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com