Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- ViewModel
- Android
- 알고리즘
- AppBarLayout
- onMeasure
- notification
- room
- onLayout
- Coroutine
- kotlin
- CustomView
- activity
- 백준
- CoordinatorLayout
- HTTP
- BOJ
- Behavior
- DataBinding
- Algorithm
- hilt
- LiveData
- 코틀린
- recyclerview
- sqlite
- View
- lifecycle
- 알림
- Navigation
- CollapsingToolbarLayout
- 안드로이드
Archives
- Today
- Total
개발일지
Android in A..Z - Hilt (Module) 본문
Hilt Module
생성자를 사용할 수 없는 Class를 주입해야 하는 경우 @Inject 생성자를 정의할 수 없습니다. (Interface, Builder를 통해 생성되는 Class, 외부 라이브러리 클래스 등)
=> Hilt Module을 통해 Class를 어떻게 얻는지 정의하여 의존성을 주입할 수 있습니다.
@Module, @Installin
@Module로 지정된 Class는 Hilt에게 인스턴스를 제공하는 방법을 알려줍니다.
@Module로 지정된 Class는 @Installin을 지정하여 각 모듈이 어떤 Scope에서 사용되는지 알려야 합니다.
@Provides
외부 라이브러리에서 제공되거나 Builder 패턴으로 제공되는 경우 @Provides를 통해 인스턴스를 제공하는 방법을 알려줄 수 있습니다.
@Module
@InstallIn(SingletonComponent::class)
class DatabaseModule {
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
return AppDatabase.getInstance(context)
}
@Provides
fun provideSummonerEntityDao(appDatabase: AppDatabase): SummonerEntityDao {
return appDatabase.summonerEntityDao()
}
}
@Binds
인터페이스를 제공하는 경우 @Inject 생성자를 만들 수 없지만 @Binds를 통해 인스턴스를 제공하는 방법을 알려줄 수 있습니다.
- abstract fun으로 알려주며 해당 함수를 가진 Module은 abstract class여야 합니다.
- 함수 매개변수가 반활된 인스턴스입니다.
- 함수 반환형이 어떤 인터페이스의 인스턴스를 제공하는지 Hilt에게 알려줍니다.
interface AnalyticsService {
fun analyticsMethods()
}
// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
...
) : AnalyticsService { ... }
@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {
@Binds
abstract fun bindAnalyticsService(
analyticsServiceImpl: AnalyticsServiceImpl
): AnalyticsService
}
@Qualifier
동일한 유형에 대한 여러 결합을 제공해야 하는 경우가 있을 수도 있습니다. 예를들어 데이터를 Server에 저장하는 방법(ServerDataSource)과 Local에 저장하는 방법(LocalDatabase)이 있다고 가정했을 때 두가지 경우를 사용할 경우 Hilt는 어떤 DataSource를 제공할지 알 수 없습니다.
@Qulifier와 annotation class를 사용하여 해결할 수 있습니다.
@Qualifier
annotation class LocalDatabase
@Qualifier
annotation class ServerDatabase
interface DataSource {
fun select()
fun update()
fun delete()
}
class LocalDataSource @Inject constructor() : DataSource {
override fun select() {
}
override fun update() {
}
override fun delete() {
}
}
class ServerDataSource @Inject constructor() : DataSource {
override fun select() {
}
override fun update() {
}
override fun delete() {
}
}
@Module
@InstallIn(SingletonComponent::class)
abstract class DataSourceModule() {
@Binds
@LocalDatabase
abstract fun provideLocalDatabase(localDataSource: LocalDataSource): DataSource
@Binds
@ServerDatabase
abstract fun provideServerDatabase(serverDataSource: ServerDataSource): DataSource
}
@AndroidEntryPoint
class MainFragment : BaseFragment<FragmentMainBinding>(R.layout.fragment_main) {
@Inject
@LocalDatabase
lateinit var database: DataSource
}
Git (예제코드)
github.com/KangTaeJong98/Example/tree/main/Android/Hilt
'Android (안드로이드) > Hilt' 카테고리의 다른 글
Android in A..Z - Hilt (Entry Point) (0) | 2021.03.30 |
---|---|
Android in A..Z - Hilt (Component) (0) | 2021.03.18 |
Android in A..Z - Hilt (개념) (0) | 2021.03.18 |
Comments