Last active
September 14, 2020 06:47
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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 | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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