Skip to content

Instantly share code, notes, and snippets.

@ch8n
Created September 22, 2020 04:57
Show Gist options
  • Save ch8n/867a4da61e70ee29f7ec44859c699742 to your computer and use it in GitHub Desktop.
Save ch8n/867a4da61e70ee29f7ec44859c699742 to your computer and use it in GitHub Desktop.
for medium article
// your core injectores need to have public all public fields
------- Domain Injection -------
// in searchmovie Domain module build.gradle
dependencies {
implementation project(":core")
}
class SearchMovieApiManager(private val retrofit : Retrofit) {
val movieSearchService : MovieSearchService by lazy {
retrofit.create(MovieSearchService::class.java)
}
}
object SearchMovieResolver {
fun provideSearchMoviewApiManager(retrofit: Retrofit)
= SearchMovieApiManager(retrofit)
}
// create injector side domain layer
object SearchDomainInjector {
// step 3, api manager requires retrofit instance
private val apiManager = SearchMovieResolver
.provideSearchMoviewApiManager(Injector.retrofit)
// step 2, movie source requires apimanager
private val movieSearchSource by lazy {
AppResolver.provideMovieDataSource(apiManager)
}
// step 1, factory requires movie search repository
val movieSearchRepository by lazy {
AppResolver.provideMovieRepository(movieSearchSource)
}
}
------- UI Injection -------
// in searchmovie module build.gradle
dependencies {
implementation project(":searchDomain")
}
object SearchMovieUiResolver {
fun provideSearchMovieVmFactory(movieRepository : MovieSearchRepository)
= MovieSearchViewModelFactory(movieRepository)
}
// in your seach module you need to create scoped injection discussed above
object SearchInjector {
fun searchViewModel(activity: AppCompatActivity) : MovieDetailViewModel {
return ViewModelResolver.provideSearchViewModel(
SearchMovieUiResolver.searchViewModelFactory, activity
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment