Skip to content

Instantly share code, notes, and snippets.

@ShinichiroFunatsu
Last active September 14, 2020 06:47
Show Gist options
  • Save ShinichiroFunatsu/e1aee6d5fd050664fd72b0491b68356a to your computer and use it in GitHub Desktop.
Save ShinichiroFunatsu/e1aee6d5fd050664fd72b0491b68356a to your computer and use it in GitHub Desktop.
[Android] Using Koin in MVP-Repository Pattern for DI ref: https://qiita.com/ShinichiroFunatsu/items/67ed52b779dfb3c21e9e
// add a class inherited Application for setup koin
class MyApp: Application() {
override fun onCreate() {
super.onCreate()
}
}
// presentation layer
object GreetContract {
interface View {
fun showGreet(greet: Greet): Unit
}
interface Presenter {
fun loadGreet()
}
}
class MainActivity
: AppCompatActivity(), GreetContract.View {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
// loadGreet
}
}
override fun showGreet(greet: Greet) {
textView.text = greet.helloWords
}
}
class GreetPresenter(
private val view: GreetContract.View,
private val countryProvider: () -> Country, // add lambda
private val getGreetUseCase: GetGreetUseCase
) : GreetContract.Presenter {
override fun loadGreet() {
val greet = getGreetUseCase.execute(countryProvider())
view.showGreet(greet)
}
}
// model layer
sealed class Greet(val helloWords: String){
object JpKonichiha: Greet("こんにちは!")
object USHello: Greet("Hello!")
object Emoji: Greet("\uD83D\uDC4B")
}
enum class Country {
JP, US, OTHER;
companion object {
fun countryProvider(): () -> Country {
var count = 0
return {
when(count++%3) { // it's not a implementation for thread safe.
0 -> Country.JP
1 -> Country.US
else -> Country.OTHER
}
}
}
}
}
class GetGreetUseCase(
private val greetRepository: GreetRepository
) {
fun execute(country: Country): Greet = greetRepository.get(country)
}
// data layer
interface GreetRepository {
fun get(country: Country): Greet
}
class GreetRepositoryImpl: GreetRepository {
override fun get(country: Country): Greet {
return when(country) {
Country.JP -> Greet.JpKonichiha
Country.US -> Greet.USHello
Country.OTHER -> Greet.Emoji
}
}
}
class MyApp: Application() {
override fun onCreate() {
super.onCreate()
+ startKoin(this, listOf(appModules))
}
+ private val appModules = module {
+ single<GreetRepository> { GreetRepositoryImpl() } // single intance
+ factory { GetGreetUseCase(get()) }
+ factory { Country.countryProvider() }
+ factory<GreetContract.Presenter> { (cv: GreetContract.View) ->
+ GreetPresenter(cv, get(), get())
+ } // add lambda argument to get `cv` in inject timing.
+ }
}
// presentation layer
class MainActivity
: AppCompatActivity(), GreetContract.View {
+ val presenter: GreetContract.Presenter by inject { parametersOf(this) } // set for cv
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
- // loadGreet
+ presenter.loadGreet()
}
}
override fun showGreet(greet: Greet) {
textView.text = greet.helloWords
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment