我试图将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;
}
}
我的AndroidApplication:
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;
}
}
这是我的活动:
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();
}
}
我会在存储库中获得空指针异常。他没有被注射。
如果我添加此行:
repository = ((AndroidApplication) getApplication()).component().dependencyRepository();
它有效,但DI的重点是不必担心这个,或者我错了吗?
我已经尝试了其他一些示例和教程,但没有设法解决我的问题。
提前致谢,
答案 0 :(得分:9)
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字段的子类不会工作:
public class ActualActivity extends BaseActivity {
@Inject IDependenceyRepository repo;
}
这是因为Dagger需要知道将在编译时注入的具体类,而不是运行时(就像Dagger 1可以做的那样)。