Я реализую приложение Sampler, используя Dagger 2
для Dependency Injection
.
Но я не могу использовать свои Сервисы (база данных SQLite использует Приложение), так как мое Приложение не может быть предоставлено моим AppComponent:
error: android.app.Application cannot be provided without an @Inject constructor or from an @Provides-annotated method.
public abstract ch.ti8m.gol.daggerchaos.persistence.SqlDatabase provideSqlDatabae();
^
android.app.Application is injected at
ch.ti8m.gol.daggerchaos.domain.di.DomainModule.provideSQLDatabase(app)
ch.ti8m.gol.daggerchaos.persistence.SqlDatabase is provided at
ch.ti8m.gol.daggerchaos.domain.di.DomainComponent.provideSqlDatabae()
Мой AppModule
@Module
class AppModule() {
@Provides
@Singleton
fun provideContext(application: Application): Context {
return application
}
@Provides
@Singleton
fun provideApplication(app: App): Application {
return app
}
}
Мой AppComponent
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(app: App)
}
Мой DomainModule
@Module
class DomainModule {
@Provides
@Singleton
fun providePizzaService(pizzaDAO: PizzaDAO): PizzaService {
return PizzaServiceImpl(pizzaDAO)
}
//TODO get Application form App Component
@Provides
@Singleton
fun provideSQLDatabase(app: Application): SqlDatabase {
return SqlDatabase(app)
}
@Provides
@Singleton
fun providePizzaDAO(db: SqlDatabase): PizzaDAO {
return PizzaDAO(db)
}
}
Мой доменный компонент
@Singleton
@Component(modules = [AppModule::class, DomainModule::class])
interface DomainComponent {
fun providePizzaService(): PizzaService
fun provideSqlDatabae(): SqlDatabase
fun providePizzaDAO(): PizzaDAO
fun inject(mainActivity: MainActivity)
fun inject(activityMainPresenterImpl: ActivityMainPresenterImpl)
}
Мое приложение
class App : Application() {
private lateinit var domainComponent: DomainComponent
override fun onCreate() {
super.onCreate()
domainComponent = DaggerDomainComponent.builder()
.appModule(AppModule())
.application(this)
.domainModule(DomainModule())
.build()
Timber.plant(Timber.DebugTree())
}
fun getDomainComponent(): DomainComponent {
return domainComponent
}
}
Где я его впрыскиваю
class ActivityMainPresenterImpl(private val activityMainView: ActivityMainView) : ActivityMainPresenter {
@Inject
lateinit var pizzaService: PizzaService
init {
DaggerDomainComponent.builder().build().inject(this)
}
...
Я только начал использовать Dagger 2 для Dependency Injection в Android, так что я уверен, что испортил структуру Injection.
Кто-нибудь знает, что я пропустил или не смог реализовать должным образом (я знаю, что существует множество способов реализовать DI с помощью Dagger)?