В моем проекте Android я использую Dagger 2. для управления внедрением зависимостей.
Вот что у меня есть в приложении (я упростил код, чтобы его было легче понять):
public class MainActivity extends DaggerAppCompatActivity
{
@Inject MainRepository mainRepository;
@Override
protected void onCreate(Bundle savedInstanceState) { ... }
}
- MainRepository, который я добавляю в MainActivity:
public class MainRepository
{
@Inject ItemsDAO itemsDAO;
public MainRepository()
{
MyApplication.getAppComponent().inject(this);
}
}
- ItemsDAO, основа c Класс DAO, который я хочу добавить в MainRepository:
public class ItemsDAO
{
....
}
public class MyApplication extends DaggerApplication
{
private static MyApplication instance;
private AppComponent appComponent;
@Override
public void onCreate()
{
super.onCreate();
instance = this;
}
public static AppComponent getAppComponent()
{
return instance.appComponent;
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector()
{
appComponent = DaggerAppComponent.builder().application(this).build();
return appComponent;
}
}
ОК, теперь вот Часть 2 кинжала:
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class})
public interface AppComponent extends AndroidInjector<MyApplication>
{
@Component.Builder
interface Builder
{
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(MainRepository mainRepository);
}
@Module
abstract class AppModule
{
@ContributesAndroidInjector(modules = {MainModule.class})
abstract MainActivity contributeMainActivity();
@Provides
static Context provideContext(Application application)
{
return application;
}
}
@Module
abstract class MainModule
{
@Provides
static MainRepository provideMainRepository()
{
return new MainRepository();
}
@Provides
static ItemsDAO provideItemsDAO(Context context)
{
return new ItemsDAO();
}
}
Вот моя проблема: когда я помещаю метод provideItemsDAO()
в AppModule
, у меня не возникает ошибки компиляции, и она работает нормально. Но когда я вставил его в MainModule
(как показано выше), я получил следующую ошибку:
com.testproject.dao.ItemsDAO cannot be provided without an @Provides-annotated method.
Почему я хочу это сделать, потому что я хочу (если я правильно понимаю Dagger 2) ItemsDAO
быть созданным только один раз за весь жизненный цикл MainActivity. Конечно, в этом базовом c примере это будет так или иначе, но я хотел бы знать, как этого добиться, чтобы я мог управлять более сложным сенаром ios (например, используя один и тот же экземпляр для нескольких фрагментов, добавленных в MainActivity
).
Так как я могу исправить эту ошибку? Что я пропустил?
Спасибо.