我正在尝试在我的应用程序中使用 Dagger 2,但我在实体存储库方面遇到了一些问题,我还没有弄清楚我缺少什么。
这是我的应用程序组件:
@Singleton
@Component(
modules = {
AndroidModule.class,
RepositoryModule.class
}
)
public interface ApplicationComponent {
void inject(AndroidApplication app);
IDependenceyRepository dependencyRepository();
}
我的模块:
@Module
public class RepositoryModule {
@Provides @Singleton IDependenceyRepository provideDependendencyRepository(Context context) {
return new DependencyRepository(context);
}
}
@Module
public class AndroidModule {
private final AndroidApplication app;
public AndroidModule(AndroidApplication app) {
this.app = app;
}
@Provides @Singleton Context provideApplicationContext() {
return app;
}
}
我的 Android 应用程序:
public class AndroidApplication extends Application {
private ApplicationComponent component;
@Override
public void onCreate() {
super.onCreate();
setupGraph();
}
private void setupGraph() {
component = DaggerApplicationComponent.builder()
.androidModule(new AndroidModule(this))
.repositoryModule(new RepositoryModule())
.build();
component.inject(this);
}
public ApplicationComponent component() {
return component;
}
}
这是我的 Activity :
public class MainActivity extends Activity {
@Inject
IDependenceyRepository repository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.testRepository();
}
private void testRepository() {
Dependency dep = new Dependency();
dep.setDescription("XXX");
dep.setName("AAAA");
try {
repository.save(dep);
Log.d("", repository.queryAll().get(0).getName());
} catch (SQLException e) {
e.printStackTrace();
}
}
发生的事情是我在存储库中收到一个空指针异常。他没有被注入(inject)。
如果我添加这一行:
repository = ((AndroidApplication) getApplication()).component().dependencyRepository();
它有效,但 DI 的重点不是不必担心这个,或者我错了?
我尝试了一些其他示例和教程,但未能解决我的问题。
提前致谢
最佳答案
david.mihola 的评论是正确的:为了能够初始化 @Inject 字段,您需要在组件中有一个方法(通常是 void inject(MyClass)
)。
值得注意的是(不是专门针对你的问题,但它可能会出现)如果你有一个基类:
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((AndroidApplication) getApplication()).component().inject(this);
}
}
在你的组件中:
void inject(BaseActivity);
注入(inject)到具有自己的@Inject 字段的子类不会工作:
public class ActualActivity extends BaseActivity {
@Inject IDependenceyRepository repo;
}
这是因为 Dagger 需要知道将在编译时注入(inject)的具体类,而不是运行时(就像 Dagger 1 可以做的那样)。
关于java - 未注入(inject) Android Dagger 2 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31372901/