Kodein
ãåããŠç®ã«ãã人åãã®ããããããã¬ã€ãã¯èŠã€ãããŸããã§ããããŸããããã¥ã¡ã³ãã¯ãã¹ãŠã®å Žæã§ééçã§äžè²«æ§ããªããããã©ã€ãã©ãªã®äž»ãªæ©èœãå
±æããããšæããŸãã äžéšã®ã©ã€ãã©ãªæ©èœããªãªãŒã¹ãããŸãããããã¯åºæ¬çã«é«åºŠãªéšåã§ãã ããã«ãã¹ãŠããããŸãã®ã§ãèšäºãèªãã§ãéåžžéãã«èµ·åããŠã
Kodein
äŸåé¢ä¿ã®å®è£
ãéå§ã§ããŸãã
Kodein 6.0.0
ã¯
Support Library 28
ãŸãã¯
AndroidX
ãå¿
èŠãšããå€ãã®ãµãŒãããŒãã£ã©ã€ãã©ãªããŸã äºææ§ã®ããããŒãžã§ã³ãæäŸããŠããªãããã誰ã決ããŠãããã«åãæ¿ããªãããããã®èšäºã¯
Kodein 5.3.0
ã«åºã¥ããŠããŸãã
Kodein
ã¯ãäŸåæ§æ³šå
¥ïŒDIïŒãå®è£
ããããã®ã©ã€ãã©ãªã§ãã ãã®æŠå¿µã«æ
£ããŠããªãå Žåã¯ã
Dagger2ã«é¢ããèšäºã®åé ãèªãã§ãã ãããèè
ãDIã®çè«çãªåŽé¢ãç°¡åã«èª¬æããŠããŸãã
ãã®èšäºã§ã¯ãAndroidã®äŸã䜿çšããŠãã¹ãŠãæ€èšããŸãããéçºè
ã«ãããšãKodeinã¯KotlinããµããŒããããã¹ãŠã®ãã©ãããã©ãŒã ïŒJVMãAndroidãJSãNativeïŒã§åãããã«åäœããŸãã
èšçœ®
Javaã«ã¯
type erasure
ããããšããäºå®ã«ãããåé¡ãçºçããŸã-ã³ã³ãã€ã©ãŒã¯ãžã§ããªãã¯åãæ¶å»ããŸãã ãã€ãã³ãŒãã¬ãã«ã§ã¯ã
List<String>
ããã³
List<Date>
ã¯åãªã
List
ã§ãã ããã§ãããžã§ããªãã¯åã«ã€ããŠã®æ
å ±ãååŸããæ¹æ³ã¯æ®ã£ãŠããŸãããã³ã¹ããããããJVMãšAndroidã§ã®ã¿æ©èœããŸãã ãã®ç¹ã«é¢ããŠã
Kodein
éçºè
ã¯2ã€ã®äŸåé¢ä¿ã®ããããã䜿çšããããšããå§ãããŸãã1ã€ã¯äœæ¥äžã«ãžã§ããªãã¯åã«é¢ããæ
å ±ãåãåãïŒ
kodein-generic
ïŒããã1ã€ã¯åãåããªãïŒ
kodein-erased
ïŒ ããšãã°ã
kodein-erased
List<String>
ããã³
List<Date
>ã䜿çšããå Žåã¯
List<*>
ãšããŠä¿åããã
kodein-generic
ã䜿çšããå Žåã¯ãã¹ãŠãæå®ãããã¿ã€ããšãšãã«ãã€ãŸã
List<String>
ããã³
List<Date>
ãšããŠä¿åãããŸã
List<Date>
ããããã
éžææ¹æ³
JVMã®äžã§ã¯
ãªãæžã蟌ã¿
kodein-erased
䜿çšããŸããããã§ãªãå Žåã¯äžå¯èœã§ãã
JVMã®äžã§æžããšããã©ãŒãã³ã¹ã®åé¡ã¯ããªãã«ãšã£ãŠéåžžã«éèŠã§ã
kodein-erased
䜿çšã§ããŸããã泚æããŠãã ããããã®çµéšã¯ãããã®èšèã®æªãæå³ã§äºæããªããããããŸããã ç¹å¥ãªããã©ãŒãã³ã¹èŠä»¶ãªãã§éåžžã®ã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåã¯ã
kodein-generic
䜿çšããŸãã
æçµçã«ãããã©ãŒãã³ã¹ãžã®DIã®åœ±é¿ã«ã€ããŠèããå Žåãã»ãšãã©ã®å ŽåãäŸåé¢ä¿ã®å€§éšåã¯äžåºŠäœæãããããäŸåé¢ä¿ã¯ç¹°ãè¿ãåå©çšããããã«äœæãããŸããããã®ãããªã¢ã¯ã·ã§ã³ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ã¯äœããªããŸãã
ãããã£ãŠãã€ã³ã¹ããŒã«ããŸãïŒ
ãŸã-ãªããžããªå
ã®build.gradleã«jcenterïŒïŒãããã¯ãã§ãïŒååšããªãå ŽåïŒã
buildscript { repositories { jcenter() } }
次ã«ãäŸåé¢ä¿ãããã¯ã§ãäžèšã®åºæ¬çãªäŸåé¢ä¿ã®ãããããè¿œå ããŸãã
implementation "org.kodein.di:kodein-di-generic-jvm:$version"
implementation "org.kodein.di:kodein-di-erased-jvm:$version"
Androidã«ã€ããŠèª¬æããŠãããããäŸåé¢ä¿ãå¢ããŸãã ãã¡ããããããªãã§ãå®è¡ã§ããŸããKodeinã¯æ£åžžã«æ©èœããŸãããAndroidã«åœ¹ç«ã€è¿œå æ©èœãæåŠããçç±ã¯äœã§ããïŒèšäºã®æåŸã§èª¬æããŸãïŒã éžæã¯ããªã次第ã§ãããè¿œå ããããšãææ¡ããŸãã
ããã«ããªãã·ã§ã³ããããŸãã
ãŸãã
SupportLibrary
ã䜿çšããŠããŸãã
implementation "org.kodein.di:kodein-di-framework-android-core:$version"
2çªç®-䜿çš
implementation "org.kodein.di:kodein-di-framework-android-support:$version"
第äž-ããªãã¯AndroidXã䜿çšããŠããŸã
implementation "org.kodein.di:kodein-di-framework-android-x:$version"
äŸåé¢ä¿ã®äœæãéå§ããŸã
Dagger2
ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ãApplicationã¯ã©ã¹ã§äŸåé¢ä¿ãäœæããã³åæåããããšã«æ
£ããŠããŸãã
Kodeinã§ã¯ãããã¯æ¬¡ã®ããã«è¡ãããŸãã
class MyApp : Application() { val kodein = Kodein { } }
äŸåé¢ä¿å®£èšã¯åžžã«æ¬¡ã§å§ãŸããŸã
bind<TYPE>() with
ã¿ã°
KodeinäŸåé¢ä¿ã¿ã°ä»ãã¯ãæ©èœã
Dagger2
Qualifier
䌌ãæ©èœ
Dagger2
ã
Dagger2
ãåå¥ã®
Qualifier
ãå®è¡ããããå®éã«ã¯
Qualifier
ã§ããã
@Named("someTag")
䜿çšããå¿
èŠããããŸãã äžçªäžã®è¡ã¯åçŽã§ã-ãã®ããã«ããŠãåãã¿ã€ãã®2ã€ã®äŸåé¢ä¿ãåºå¥ããŸãã ããšãã°ãç¶æ³ã«å¿ããŠã¢ããªã±ãŒã·ã§ã³ãŸãã¯ç¹å®ã®
Activity
ã®
ontext
ãååŸããå¿
èŠããããããäŸåé¢ä¿ã宣èšãããšãã«ãã®ã¿ã°ãæå®ããå¿
èŠããããŸãã
Kodein
䜿çš
Kodein
ãšãã¿ã°ãªãã§1ã€ã®äŸåé¢ä¿ã宣èšã§ã
Kodein
ãããã¯ããŒã¹äŸåé¢ä¿ã§ãããäŸåé¢ä¿ã®åä¿¡æã«ã¿ã°ãæå®ããªãå Žåã¯ååŸããŸããä»ã®ã¿ã°ã¯ã¿ã°ä»ãããå¿
èŠããããã¿ã°ã¯äŸåé¢ä¿ã®åä¿¡æã«æå®ããå¿
èŠããããŸãã
val kodein = Kodein { bind<Context>() with ... bind<Context>(tag = "main_activity") with ... bind<Context>(tag = "sale_activity") with ... }
tag
ãã©ã¡ãŒã¿ã®åã¯
Any
ã§ãããããåãªãæåå以äžã®ãã®ã䜿çšã§ããŸãã ãã ããã¿ã°ãšããŠäœ¿çšãããã¯ã©ã¹ã¯ã
equals
hashCode
ãš
hashCode
ã¡ãœãããå®è£
ããå¿
èŠ
equals
ã«
hashCode
ã äŸåé¢ä¿ãäœæãããåä¿¡ãããã«ããããããã¿ã°ãååä»ãåŒæ°ãšããŠé¢æ°ã«æž¡ãå¿
èŠãåžžã«ãããŸãã
äŸåæ§æ³šå
¥ã®ã¿ã€ã
Kodein
ã«äŸåé¢ä¿ãæäŸããæ¹æ³ã¯ããã€ããããŸããåºæ¬çãªããš
Kodein
ãŸã-
Kodein
ãäœæããŸãã ã·ã³ã°ã«ãã³ã¯ãäœæããã
Kodein
ã€ã³ã¹ã¿ã³ã¹ã®ãã¬ãŒã ã¯ãŒã¯å
ã«
Kodein
ãŸãã
ã·ã³ã°ã«ãã³ã®çŽ¹ä»
äŸããå§ããŸãããïŒ
val kodein = Kodein { bind<IMyDatabase>() with singleton { RoomDb() } }
ãããã£ãŠã
IMyDatabase
ãæäŸïŒæäŸïŒãããã®èåŸã«
RoomDb
ã€ã³ã¹ã¿ã³ã¹ãé ãããŸãã
RoomDb
ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãäŸåé¢ä¿ã®æåã®ãªã¯ãšã¹ãã§
Kodein
ããæ°ãã
Kodein
ã€ã³ã¹ã¿ã³ã¹ã
Kodein
ãããŸã§
Kodein
ãããŸããã ã·ã³ã°ã«ãã³ã¯åæåãããŠäœæãããŸãããå¿
èŠã«å¿ããŠéåæåããããšãã§ããŸãã ããã«ããçç£æ§ãåäžããŸãããããã«äŒŽããªã¹ã¯ãç解ããå¿
èŠããããŸãã
val kodein = Kodein { bind<IMyDatabase>() with singleton(sync = false) { RoomDb() } }
äŸåé¢ä¿ã®ã€ã³ã¹ã¿ã³ã¹ãæåã®åŒã³åºãã§ã¯ãªãã
Kodein
ã€ã³ã¹ã¿ã³ã¹ã®äœæçŽåŸã«äœæãã
Kodein
å Žåã¯ãå¥ã®é¢æ°ã䜿çšããŸãã
val kodein = Kodein { bind<IMyDatabase>() with eagerSingleton { RoomDb() } }
åžžã«äŸåé¢ä¿ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãã
ã·ã³ã°ã«ããŒã³ã§ã¯ãªããäŸåé¢ä¿ã«ã¢ã¯ã»ã¹ããŠãã®æ°ããã€ã³ã¹ã¿ã³ã¹ãååŸãããšãã«åžžã«äœæããããšãã§ããŸãã ããã«ã¯ã
provider
é¢æ°ã䜿çšãããŸãã
val kodein = Kodein { bind<IMainPresenter>() with provider { QuantityPresenter() } }
ãã®å Žåã
IMainPresenter
äŸåé¢ä¿ãèŠæ±ãã
IMainPresenter
ã
QuantityPresenter
æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã
åžžã«äŸåé¢ä¿ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãããã©ã¡ãŒã¿ãŒãäŸåé¢ä¿ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããŸã
åã®äŸã®ããã«ãäŸåé¢ä¿ã®ãªã¯ãšã¹ãããšã«æ°ããã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸãããåæã«äŸåé¢ä¿ãäœæããããã®ãã©ã¡ãŒã¿ãŒãæå®ããŸãã ãã©ã¡ãŒã¿ãŒã¯æ倧
5ã«ããããšãã§ããŸãã ãã®åäœã«ã¯ã
factory
ã¡ãœããã䜿çšããŸãã
val kodein = Kodein { bind<IColorPicker>() with factory { r: Int, g: Int, b: Int, a: Int -> RgbColorPicker(r, g, b, a) } }
ãã©ã¡ãŒã¿ã«å¿ããŠãã£ãã·ã¥ãããã€ã³ã¹ã¿ã³ã¹ãäœæãããã³ã«
åã®æ®µèœãèªãã§ãæž¡ããããã©ã¡ãŒã¿ãŒã«åŸã£ãŠæ¯åæ°ããã€ã³ã¹ã¿ã³ã¹ãåãåãã®ã§ã¯ãªããåããã©ã¡ãŒã¿ãŒã®äŸåé¢ä¿ã®åãã€ã³ã¹ã¿ã³ã¹ãåãåãã®ãè¯ããšæããããããŸããã
val kodein = Kodein { bind<IRandomIntGenerator>() with multiton { from: Int, to: Int -> IntRandom(from, to) } }
äžèšã®äŸã§ã¯ãæåã«ãã©ã¡ãŒã¿ãŒ
5
ãš
10
äŸåé¢ä¿ãååŸãããšãã«ã
IntRandom(5, 10)
æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸããåããã©ã¡ãŒã¿ãŒã§äŸåé¢ä¿ãå床åŒã³åºããšã以åã«äœæããã€ã³ã¹ã¿ã³ã¹ãååŸããŸãã ãããã£ãŠãé
延åæåã䜿çšããã·ã³ã°ã«ããŒã³ããã®
map
ãå€æããŸãã
factory
ã®å Žåã®ããã«ãåŒæ°
factory
æ倧
5ã§ãã
ã·ã³ã°ã«ããŒã³ãšåæ§ã«ãããã§åæããªãã«ã§ããŸãã
val kodein = Kodein { bind<IRandomIntGenerator>() with multiton(sync = false) { from: Int, to: Int -> IntRandom(from, to) } }
Kodeinã§ãœãããªã³ã¯ãšåŒ±ããªã³ã¯ã䜿çšãã
singleton
ãŸãã¯
multiton
ã䜿çšããŠäŸåé¢ä¿ãæäŸããå Žåãæ ŒçŽãããã€ã³ã¹ã¿ã³ã¹ãžã®åç
§ã®ã¿ã€ããæå®ã§ããŸãã äžèšã§æ€èšããéåžžã®å Žå-ããã¯éåžžã®
strong
ãªã³ã¯ã«ãªããŸãã ãã ãã
soft
ãªã³ã¯ãš
weak
ãªã³ã¯ã䜿çšããããšã¯å¯èœã§ãã ãããã®æŠå¿µã«æ
£ããŠããªãå Žåã¯ã
ãã¡ãã
ãã§ãã¯ããŠãã ãã ã
ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ã©ã€ããµã€ã¯ã«ã®äžéšãšããŠã·ã³ã°ã«ããŒã³ãåäœæãããå Žåãšããã§ãªãå ŽåããããŸãã
val kodein = Kodein { bind<IMyMap>() with singleton(ref = softReference) { WorldMap() } bind<IClient>() with singleton(ref = weakReference) { id -> clientFromDB(id) } }
ã¹ããªãŒã ããšã«åå¥ã®ã·ã³ã°ã«ãã³
ããã¯åãã·ã³ã°ã«ãã³ã§ãããäŸåé¢ä¿ãèŠæ±ããåã¹ã¬ããã«å¯ŸããŠãã·ã³ã°ã«ãã³ãäœæãããŸãã ãããè¡ãã«ã¯ã䜿ãæ
£ãããã©ã¡ãŒã¿ãŒ
ref
䜿çšããŸãã
val kodein = Kodein { bind<Cache>() with singleton(ref = threadLocal) { LRUCache(16 * 1024) } }
åã蟌ã¿å¯èœãªäŸåé¢ä¿ãšããŠã®å®æ°
å®æ°ãäŸåé¢ä¿ãšããŠæäŸã§ããŸãã ãã®ããã¥ã¡ã³ãã§ã¯ã
Kodein
ã䜿çšãããšãããªããã£ããããŒã¿ã¯ã©ã¹ãªã©ãç¶æ¿ãã€ã³ã¿ãŒãã§ã€ã¹ã®ãªãåçŽåã®å®æ°ã
Kodein
å¿
èŠããããšããäºå®ã«æ³šç®ããŠããŸãã
val kodein = Kodein { constant(tag = "maxThread") with 8 constant(tag = "serverURL") with "https://my.server.url"
ã¿ã€ããå€æŽããã«äŸåé¢ä¿ãäœæãã
ããšãã°ãäŸåé¢ä¿ãã·ã³ã°ã«ãã³ãšããŠæäŸãããããã€ã³ã¿ãŒãã§ã€ã¹ã®èåŸã«é ããªãã§ãã ããã
bind
ãåŒã³åºããŠ
with
代ããã«
from
ã䜿çš
bind
å Žåãåã«ã¿ã€ããæå®ããããšã¯ã§ããŸããã
val kodein = Kodein { bind() from singleton { Gson() }
äžèšã®äŸã®äŸåé¢ä¿ã«ã¯ãé¢æ°ã®æ»ãå€ã®åããããŸããã€ãŸãã
Gson
åã®äŸåé¢ä¿ã
Gson
ãŸãã
ã¹ãŒããŒã¯ã©ã¹ãŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®ãµãã¿ã€ãããšã«äŸåé¢ä¿ãäœæããŸã
Kodein
䜿çš
Kodein
ãšãåäžã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããç¹å®ã®ã¯ã©ã¹ïŒè€æ°
Kodein
ã®åå«ã«ããŸããŸãªæ¹æ³ã§äŸåé¢ä¿ãæäŸã§ã
Kodein
ã
val kodein = Kodein { bind<Animal>().subTypes() with { animalType -> when (animalType.jvmType) { Dog::class.java -> eagerSingleton { Dog() } else -> provider { WildAnimal(animalType) } } }
Animal
ã¯ã©ã¹ã¯ãã¹ãŒããŒã¯ã©ã¹ãŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ããããã§ã
.subtypes
ã䜿çšããŠã
TypeToken<*>
.subtypes
ãååŸããŸãã
animalType
ããJavaã¯ã©ã¹ãååŸããããã«å¿ããŠãããŸããŸãªæ¹æ³ã§äŸåé¢ä¿ãæäŸããŸãã ãã®æ©èœã¯ã
TypeToken
ãŸãã¯ãã®æŽŸçç©ãå€ãã®å Žåã®ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšããå Žåã«åœ¹ç«ã¡ãŸãã ãŸãããã®æ¹æ³ã§ã¯ãç°ãªãã¿ã€ãã«å¯ŸããŠåãäŸåé¢ä¿ãäœæããŠãäžèŠãªã³ãŒããåé¿ã§ããŸãã
ãã©ã¡ãŒã¿ãŒãšããŠä»ã®äŸåé¢ä¿ãå¿
èŠãšããäŸåé¢ä¿ãäœæãã
ã»ãšãã©ã®å ŽåãäŸåé¢ä¿ãšããŠãã©ã¡ãŒã¿ãŒãªãã®ã¯ã©ã¹ãäœæããã ãã§ãªããã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã©ã¡ãŒã¿ãŒãæž¡ãå¿
èŠãããã¯ã©ã¹ãäœæããŸãã
class ProductGateway(private val api: IProductApi, private val dispatchers: IDispatchersContainer) : IProductGateway
Kodein
以åã«äœæãããäŸåé¢ä¿ãæã€ã¯ã©ã¹ãäœæãã
Kodein
ãinstanceïŒïŒé¢æ°åŒã³åºãããã©ã¡ãŒã¿ãŒãšããŠæž¡ãã ãã§ååã§ãã ãã®å Žåãäœæã®é åºã¯éèŠã§ã¯ãããŸããã
bind<IDispatchersContainer>() with singleton { DispatchersContainer() } bind<IProductGateway>() with singleton { ProductGateway(instance(), instance()) } bind<IProductApi>() with singleton { ProductApi() }
instance()
代ããã«ã
provider()
ãŸãã¯
factory()
åŒã³åºããããå ŽåããããŸãããããã®ã¡ãœããã«ã€ããŠã¯ãäŸåé¢ä¿ã®ååŸãšå®è£
ã«é¢ããã»ã¯ã·ã§ã³ã§è©³ããèŠãŠãããŸãã
以åã«äœæããäŸåé¢ä¿ã¡ãœãããåŒã³åºããŠäŸåé¢ä¿ãäœæããŸã
ããŸãè¯ãèãããŸãããã
instance<TYPE>
ãåŒã³åºããŠããã§ã«æäŸãããŠããã¯ã©ã¹ãååŸãããã®ã¯ã©ã¹ã®ã¡ãœãããåŒã³åºããŠæ°ããäŸåé¢ä¿ãååŸã§ããŸãã
bind<DataSource>() with singleton { MySQLDataSource() } bind<Connection>() with provider { instance<DataSource>().openConnection() }
ã¢ãžã¥ãŒã«
Dagger2
ã䜿çšã
Dagger2
äŸåé¢ä¿ã
Dagger2
æ
£ããŠ
Dagger2
ã
Kodein
ã§ã¯ãäžèŠããã¹ãŠãããŸãè¯ãèŠããŸããã
Application
ã¯ã©ã¹ã§å€ãã®äŸåé¢ä¿ãäœæããå¿
èŠããããŸãããå人çã«ã¯ããŸã奜ãã§ã¯ãããŸããã ãããã解決çããããŸã
Kodein
ã§ã¯ãã¢ãžã¥ãŒã«ãäœæããå¿
èŠã«å¿ããŠãããã®å Žæã«æ¥ç¶ããããšãã§ããŸãã
val appModule = Kodein.Module("app") { bind<Gson>() with singleton { provideGson() } bind<HttpClient>() with singleton { provideHttpClient() } } val kodein: Kodein = Kodein { import(appModule) bind<ISchedulersContainer>() with singleton { SchedulersContainer() }
ãã ããã¢ãžã¥ãŒã«ã¯äŸåé¢ä¿ãååŸããããã®ã¡ãœããã宣èšããåãªãã³ã³ããã§ãããã¯ã©ã¹èªäœã¯äœæããªãããšã«æ³šæããŠãã ããã ãããã£ãŠãäŸåé¢ä¿ã®åä¿¡ãã¢ãžã¥ãŒã«ã§ã·ã³ã°ã«ãã³ãšããŠå®£èšãããã®ã¢ãžã¥ãŒã«ã
Kodein
2ã€ã®ç°ãªãã€ã³ã¹ã¿ã³ã¹ã«
Kodein
ãããšã
Kodein
ã€ã³ã¹ã¿ã³ã¹ããšã«1ã€ãã€ã2ã€ã®ç°ãªãã·ã³ã°ã¬ãããååŸãããŸãã
ãŸããåã¢ãžã¥ãŒã«ã®ååã¯äžæã§ããå¿
èŠããããŸãã ãã ããã¢ãžã¥ãŒã«ãå¥ã®ãããžã§ã¯ãããã€ã³ããŒãããå¿
èŠãããå Žåãååã®äžææ§ãä¿èšŒããã®ã¯å°é£ã§ã;ãã®ãããã¢ãžã¥ãŒã«ã®ååãå€æŽããããååã«ãã¬ãã£ãã¯ã¹ãè¿œå ã§ããŸãã
import(apiModule.copy(name = "firstAPI")) import(secondApiModule.copy(prefix = "secondAPI-"))
ç§ã¯ãã¢ãžã¥ãŒã«ãäºãã«äŸåããããçš®ã®éå±€ãæ§æããŠãããšãã«äœæ¥ã«æ
£ããŠããŸãã åã¢ãžã¥ãŒã«ãäžåºŠ
Kodein
ã€ã³ããŒãã§ãããããåãäŸåã¢ãžã¥ãŒã«ãæã€2ã€ã®ã¢ãžã¥ãŒã«ã1ã€ã®
Kodein
ã«ã€ã³ããŒãããããšãããšãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã 解決çã¯ç°¡åã§ã
importOnce(someModule)
åŒã³åºãã䜿çšããŠã€ã³ããŒãããå¿
èŠããããŸããããã¯ãåãååã®ã¢ãžã¥ãŒã«ã以åã«ã€ã³ããŒãããããã©ããã確èªããå¿
èŠã«å¿ããŠã€ã³ããŒãããŸãã
ããšãã°ããã®ãããªå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ã¯ã©ãã·ã¥ããŸãã
val appModule = Kodein.Module("app") { bind<Gson>() with singleton { provideGson() } } val secondModule = Kodein.Module("second") { import(appModule) } val thirdModule = Kodein.Module("third") { import(appModule) } val kodein: Kodein = Kodein { import(secondModule) import(thirdModule) }
val appModule = Kodein.Module("app") { bind<Gson>() with singleton { provideGson() } } val secondModule = Kodein.Module("second") { importOnce(appModule) } val thirdModule = Kodein.Module("third") { import(appModule) } val kodein: Kodein = Kodein { import(secondModule) import(thirdModule) }
ãã ãã
importOnce
åŒã³åºãã2åç®ã®æ¥ç¶è©Šè¡ã§ããå Žåããã¹ãŠãæ©èœããŸãã 泚æããŠãã ããã
val appModule = Kodein.Module("app") { bind<Gson>() with singleton { provideGson() } } val secondModule = Kodein.Module("second") { import(appModule) } val thirdModule = Kodein.Module("third") { importOnce(appModule) } val kodein: Kodein = Kodein { import(secondModule) import(thirdModule) }
ç¶æ¿
åãã¢ãžã¥ãŒã«ã2å䜿çšãããšãç°ãªãäŸåé¢ä¿ãäœæãããŸãããç¶æ¿ãš
Dagger2
䌌ãåäœã®å®è£
ã«ã€ããŠã¯
Dagger2
ã§ããããïŒ ãã¹ãŠãç°¡åã§ã
Kodein
ã€ã³ã¹ã¿ã³ã¹ããç¶æ¿ããã ãã§ãçžç¶äººã®èŠªã®ãã¹ãŠã®äŸåé¢ä¿ã«ã¢ã¯ã»ã¹ã§ããŸãã
val kodein: Kodein = Kodein { bind<ISchedulersContainer>() with singleton { SchedulersContainer() }
åå®çŸ©
ããã©ã«ãã§ã¯ãäŸåé¢ä¿ããªãŒããŒã©ã€ãããããšã¯ã§ããŸãããããããªããšããŠãŒã¶ãŒã倢äžã«ãªããã¢ããªã±ãŒã·ã§ã³ãæ£ããåäœããªãçç±ãæ¢ããŸãã ãã ãã
bind
é¢æ°ã®è¿œå ãã©ã¡ãŒã¿ãŒã䜿çšããŠãããè¡ãããšã¯å¯èœã§ãã ãã®æ©èœã¯ãããšãã°ãã¹ãã®æŽçã«åœ¹ç«ã¡ãŸãã
val kodein = Kodein { bind<Api>() with singleton { ApiImpl() } bind<Api>(overrides = true) with singleton { OtherApiImpl() } }
æ¢å®ã§ã¯ãã¢ãžã¥ãŒã«ãšãã®äŸåé¢ä¿ã¯ã
Kodein
ãªããžã§ã¯ãã§æ¢ã«å®£èšãããŠããäŸåé¢ä¿ããªãŒããŒã©ã€ãã§ããŸããããã¢ãžã¥ãŒã«ãã€ã³ããŒããããšãã«ããã®äŸåé¢ä¿ãæ¢åã®ãã®ã«ãã£ãŠãªãŒããŒã©ã€ãã§ããããã«æå®ã§ããŸãããã®ã¢ãžã¥ãŒã«å
ã§ã¯ãä»ã®ãŠãŒã¶ãŒããªãŒããŒã©ã€ãã§ããäŸåé¢ä¿ãæ¢ã«æå®ã§ããŸãã
ããŸãæ確ã«èãããŸããããäŸã䜿çšããŸãããã ãããã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯ã¯ã©ãã·ã¥ããŸãã
val appModule = Kodein.Module("app") { bind<Gson>() with singleton { provideGson() } } val kodein: Kodein = Kodein { bind<Gson>() with singleton { provideGson() } import(appModule) }
val appModule = Kodein.Module("app") { bind<Gson>() with singleton { provideGson() } } val kodein: Kodein = Kodein { bind<Gson>() with singleton { provideGson() } import(appModule, allowOverride = true) }
ãããŠãããã§ã¯ãã¢ãžã¥ãŒã«ã®äŸåé¢ä¿ã
Kodein
ãªããžã§ã¯ãã§å®£èšãããäŸåé¢ä¿ãäžæžãããŸãã
val appModule = Kodein.Module("app") { bind<Gson>(overrides = true) with singleton { provideGson() } } val kodein: Kodein = Kodein { bind<Gson>() with singleton { provideGson() } import(appModule, allowOverride = true) }
ããããæ¬åœã«ããããããšãç解ããŠããå Žåã¯ã
Kodein
ãªããžã§ã¯ããšåãäŸåé¢ä¿ãããå Žåã«ããããåå®çŸ©ããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããªãã¢ãžã¥ãŒã«ãäœæã§ããŸãã ã¢ãžã¥ãŒã«ã«ã¯
allowSilentOverride
ãã©ã¡ãŒã¿ãŒã䜿çšããŸãã
val testModule = Kodein.Module(name = "test", allowSilentOverride = true) { bind<EmailClient>() with singleton { MockEmailClient() } }
ããã¥ã¡ã³ãã§ã¯ãäŸåé¢ä¿ã®ç¶æ¿ãšåå®çŸ©ãããã³ç¶æ¿è
ã®äŸåé¢ä¿ã®ã³ããŒã«é¢ããããè€éãªç¶æ³ã«ã€ããŠèª¬æããŠããŸããããããã®ç¶æ³ã¯ããã§ã¯èæ
®ããŸããã
äŸåé¢ä¿ã®ååŸãšæ³šå
¥
æåŸã«ãå€ãã®æ¹æ³ã§äŸåé¢ä¿ã宣èšããæ¹æ³ãèŠã€ããŸãããä»åºŠã¯ãã¯ã©ã¹ã§äŸåé¢ä¿ãååŸããæ¹æ³ãèŠã€ããŸãã
Kodein
éçºè
ã¯ãäŸåé¢ä¿ãååŸãã2ã€ã®æ¹æ³-
injection
ãš
retieval
ãŸãã èŠããã«ã
injection
ã¯ãã¯ã©ã¹ãäœæããããšããã€ãŸãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã¹ãŠã®äŸåé¢ä¿ãåãåããšãã§ããã
retrieval
ã¯ãã¯ã©ã¹èªäœããã®äŸåé¢ä¿ãååŸãã責任ããããšãã§ãã
injection
ã䜿çš
injection
ãã¯ã©ã¹ã¯
Kodein
ã«ã€ããŠäœãèªèãããã¯ã©ã¹å
ã®ã³ãŒãã¯ã¯ãªãŒã³ã§ããã
Kodein
ã䜿çšãããšãäŸåé¢ä¿ãããæè»ã«ç®¡çããæ©äŒããããŸãã
retrieval
ã®å ŽåãäŸåé¢ä¿ãžã®æåã®ã¢ããŒã«ã®æç¹ã§ã®ã¿
retrieval
ãã¹ãŠã®äŸåé¢ä¿ãé
延çã«ååŸãããŸãã
äŸåé¢ä¿ã䜿çšããããã®Kodein
ã¡ãœãã
Kodein
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãäŸåé¢ä¿ãäŸåé¢ä¿ãã¡ã¯ããªããŸãã¯äŸåé¢ä¿ãããã€ããŒãè¿ã3ã€ã®ã¡ãœããããã
provider()
ãããããã
instance()
ã
factory()
ããã³
provider()
ã§ãã ãããã£ãŠã
factory
ãŸãã¯
provider
ã䜿çšããŠäŸåé¢ä¿ãæäŸãããšãé¢æ°å®è¡ã®çµæã ãã§ãªããé¢æ°èªäœãåãåãããšãã§ããŸãã ãã¹ãŠã®ããªãšãŒã·ã§ã³ã§ã¿ã°ã䜿çšã§ããããšã«æ³šæããŠãã ããã
val kodein: Kodein = Kodein { bind<BigDecimal>() with factory { value: String -> BigDecimal(value) } bind<Random>() with provider { Random() } } private val number: BigDecimal by instance(arg = "23.87") private val numberFactory: (value: String) -> BigDecimal by factory() private val random: Random by instance() private val randomProvider: () -> Random by provider()
ã³ã³ã¹ãã©ã¯ã¿ãŒã«ããäŸåæ§æ³šå
¥
ãã§ã«ç解ããŠããããã«ãããã¯
injection
ã«é¢ãããã®ã§ãã å®è£
ããã«ã¯ããŸãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã¹ãŠã®ã¯ã©ã¹ã®äŸåé¢ä¿ãåãåºããŠããã
kodein.newInstance
ãåŒã³åºããŠã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå¿
èŠããããŸã
class ProductApi(private val client: HttpClient, private val gson: Gson) : IProductApi class Application : Application() { val kodein: Kodein = Kodein { bind<Gson>() with singleton { provideGson() } bind<HttpClient>() with singleton { provideHttpClient() } } private val productApi: IProductApi by kodein.newInstance { ProductApi(instance(), instance()) } }
ãã«å¯èœããããã£ãžã®äŸåæ§æ³šå
¥
äŸåé¢ä¿ã宣èšãããŠãããã©ããããããªãå¯èœæ§ããããŸãã äŸåé¢ä¿ã
Kodein
ã€ã³ã¹ã¿ã³ã¹ã§å®£èšãããŠããªãå Žåãäžèšã®äŸã®ã³ãŒãã¯
Kodein.NotFoundException
ãŸãã çµæãšããŠ
null
é¢æ°ãååŸãããå ŽåãäŸåé¢ä¿ããªãå Žåã
instanceOrNull()
ã
factoryOrNull()
ããã³
providerOrNull()
3ã€ã®è£å©é¢æ°ããã
providerOrNull()
ã
class ProductApi(private val client: HttpClient?, private val gson: Gson) : IProductApi class Application : Application() { val kodein: Kodein = Kodein { bind<Gson>() with singleton { provideGson() } } private val productApi: IProductApi by kodein.newInstance { ProductApi(instanceOrNull(), instance()) } }
ã¯ã©ã¹å
ã®äŸåé¢ä¿ãååŸããŸãã
åè¿°ã®ããã«ã
retrieval
ã䜿çšããå Žåããã¹ãŠã®äŸåé¢ä¿ã®åæåã¯ããã©ã«ãã§é
延ããŸãã ããã«ãããå¿
èŠãªå Žåã«ã®ã¿äŸåé¢ä¿ãååŸããã·ã¹ãã ãäœæããã¯ã©ã¹ã®äŸåé¢ä¿ãååŸã§ããŸãã
Activity
ã
Fragment
ããã³ç¬èªã®ã©ã€ããµã€ã¯ã«ãæã€ä»ã®ã¯ã©ã¹ã¯ãã¹ãŠãããã«ã€ããŠã§ãã
Activity
äŸåé¢ä¿ãå®è£
ããã«ã¯ãKodeinã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ã®ã¿ãå¿
èŠã§ãããã®åŸãæ¢ç¥ã®ã¡ãœããã䜿çšã§ããŸãã å®éãäžèšã®
retrieval
äŸãèŠãŠããŸãããããããã£ã宣èšãããããé¢æ°
instance()
ã
factory()
ãŸãã¯
provider()
ããããã«å§ä»»ããã ãã§ãã
private val number: BigDecimal by kodein.instance(arg = "23.87") private val numberFactory: (value: String) -> BigDecimal by kodein.factory() private val random: Random? by kodein.instanceOrNull() private val randomProvider: (() -> Random)? by kodein.providerOrNull()
å·¥å Žã«ãã©ã¡ãŒã¿ãŒãæž¡ã
ãã§ã«äžèšã®ããã«ããã©ã¡ãŒã¿ãŒããã¡ã¯ããªãŒã«æž¡ãã«ã¯ãarg
é¢æ°parameterã䜿çšããã ãã§ååinstance
ã§ããããããããã€ãã®ãã©ã¡ãŒã¿ãŒãããå Žåã¯ã©ãã§ããããïŒä»¥åã«å·¥å Žã«æ倧5ã€ã®ãã©ã¡ãŒã¿ãŒãååšããå¯èœæ§ããããšèšããŸããïŒïŒãªãŒããŒããŒããããã³ã³ã¹ãã©ã¯ã¿ãŒãæã¡ã2ã5åã®åŒæ°ãåãããšãã§ãããã©ã¡ãŒã¿ãŒã«arg
ã¯ã©ã¹ãæž¡ãã ãã§ãM
ã val kodein = Kodein { bind<IColorPicker>() with factory { r: Int, g: Int, b: Int, a: Int -> RgbColorPicker(r, g, b, a) } } val picker: IColorPicker by kodein.instance(arg = M(255, 211, 175, 215))
äŸåé¢ä¿ã®åæåã匷å¶ãã
圌ããèšã£ãããã«-ããã©ã«ãã§ã¯ãåæåã¯æ zyã§ãããããªã¬ãŒãäœæããããããã£ãè€æ°ã®ããããã£ããŸãã¯ã€ã³ã¹ã¿ã³ã¹å
šäœã«ãã€ã³ãããããšKodein
ãã§ããŸãããã®ããªã¬ãŒããã«ãããšãäŸåé¢ä¿ãåæåãããŸãã val myTrigger = KodeinTrigger() val gson: Gson by kodein.on(trigger = myTrigger).instance() myTrigger.trigger()
val myTrigger = KodeinTrigger() val kodeinWithTrigger = kodein.on(trigger = myTrigger) val gson: Gson by kodeinWithTrigger.instance() myTrigger.trigger()
ã¬ã€ãžãŒã³ãã€ã³ã€ã³ã¹ã¿ã³ã¹ã®äœæ
ãã®åã«ãåžžã«æ瀺çã«ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããKodein
ãLazyKodein
ããªããžã§ã¯ããè¿ãå¿
èŠã®ããã³ã³ã¹ãã©ã¯ã¿ãŒå
ã®é¢æ°ãåãå
¥ããã¯ã©ã¹ã䜿çšããŠããã®ããããã£ã®åæåã延æããããšãã§ããŸãKodein
ããã®ã¢ãããŒãã¯ãããšãã°ãç¹å®ã®Kodeinã€ã³ã¹ã¿ã³ã¹ããã®äŸåé¢ä¿ããŸã£ããå¿
èŠãã©ãããäžæãªå Žåã«åœ¹ç«ã¡ãŸãã val kodein: Kodein = LazyKodein { Kodein { bind<BigDecimal>() with factory { value: String -> BigDecimal(value) } bind<Random>() with provider { Random() } } } private val number: BigDecimal by kodein.instance(arg = "13.4") number.toPlainString()
Kodein.lazyãåŒã³åºããšãåæ§ã®çµæãåŸãããŸãã val kodein: Kodein = Kodein.lazy { bind<BigDecimal>() with factory { value: String -> BigDecimal(value) } bind<Random>() with provider { Random() } } private val number: BigDecimal by kodein.instance(arg = "13.4") number.toPlainString()
ã³ãã€ã³é
延åæå
é
延åæåã®å ŽåKodein
ããªããžã§ã¯ããååšãLateInitKodein
ãŸãããã®ãªããžã§ã¯ããäœæããããããã£ã®äœæããã®ãªããžã§ã¯ãã«å§ä»»ãããªããžã§ã¯ãèªäœãåæåããåŸãããããã£ããã®ãªããžã§ã¯ãã«èšå®ãããšbaseKodein
ãäŸåé¢ä¿ã«æ¢ã«ã¢ã¯ã»ã¹ã§ããŸãã val kodein = LateInitKodein() val gson: Gson by kodein.instance() kodein.baseKodein = gson.fromJson(someStr)
æå®ãããã¿ã€ãã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸã
æå®ãããåã®ã€ã³ã¹ã¿ã³ã¹ãšãã®ãã¹ãŠã®åå«ããã©ãŒã ã§Kodeinã«èŠæ±ã§ããŸãList
ããã¹ãŠã¯æå®ãããã¿ã°å
ã«ã®ã¿ãããŸãããããè¡ãã«ã¯ãæ¹æ³ããããŸãallInstances
ãallProviders
ãallFactories
ã val kodein: Kodein = Kodein { bind<Number>() with singleton { Short.MAX_VALUE } bind<Double>() with singleton { 12.46 } bind<Double>("someTag") with singleton { 43.89 } bind<Int>() with singleton { 4562 } bind<Float>() with singleton { 136.88f } } val numbers: List<Number> by kodein.allInstances()
ãã°ã«å°å·ãããšã[32767ã136.88ã4562ã12.46]ã衚瀺ãããŸããã¿ã°ãšã®äŸåé¢ä¿ã¯ãªã¹ãã«å«ãŸããŠããŸããã§ãããKodeinAwareã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠäŸåé¢ä¿ã®ååŸãç°¡çŽ å
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãtypeããããã£ããªãŒããŒã©ã€ãããå¿
èŠãKodein
ããããã®ä»£ããã«ãã€ã³ã¹ã¿ã³ã¹ã§äœ¿çšå¯èœãªãã¹ãŠã®æ©èœã«ã¢ã¯ã»ã¹ã§ããŸãKodein
ã class MyApplication : Application(), KodeinAware { override val kodein: Kodein = Kodein { bind<Number>() with singleton { Short.MAX_VALUE } bind<Double>() with singleton { 12.46 } bind<Double>("someTag") with singleton { 43.89 } bind<Int>() with singleton { 4562 } bind<Float>() with singleton { 136.88f } } val numbers: List<Number> by allInstances() }
ã芧ã®ãšããby allInstances()
ãby kodein.allInstances()
以åã¯äŸåé¢ä¿ãåä¿¡ããããã®ããªã¬ãŒã«ã€ããŠæ¢ã«èª¬æããããã«ã以åã®ä»£ããã«ç°¡åã«èšè¿°ã§ããŸããã€ã³ã¿ãŒãã§ã€ã¹ã§KodeinAware
ã¯ãããªã¬ãŒããªãŒããŒã©ã€ããããã®ããªã¬ãŒãåŒã³åºããããšãã«å®£èšããããã¹ãŠã®äŸåé¢ä¿ãååŸã§ããŸãã class MyApplication : Application(), KodeinAware { override val kodein: Kodein = Kodein { bind<Number>() with singleton { Short.MAX_VALUE } bind<Double>() with singleton { 12.46 } bind<Double>("someTag") with singleton { 43.89 } bind<Int>() with singleton { 4562 } bind<Float>() with singleton { 136.88f } } override val kodeinTrigger = KodeinTrigger() val numbers: List<Number> by allInstances() override fun onCreate() { super.onCreate() kodeinTrigger.trigger() } }
äŸåé¢ä¿ãšã€ã³ã¹ã¿ã³ã¹ãžã®ã¢ã¯ã»ã¹Kodein
ãé
延ããŠãããããKodein
Kotlinã«çµã¿èŸŒãŸããé¢æ°ã®ã€ã³ã¹ã¿ã³ã¹åæåãå§ä»»ã§ããŸãlazy
ããã®ãããªã¢ãããŒãã¯ãã³ã³ããã¹ããªã©ã«å¿ããŠã¯ã©ã¹ã§åœ¹ç«ã¡ãŸãïŒäŸïŒïŒActivity
ã class CategoriesActivity : Activity(), KodeinAware { override val kodein: Kodein by lazy { (application as MyApplication).kodein } private val myFloat: Float by instance()
åãçç±ã§ã修食åã䜿çšã§ããŸãlateinit
ã class CategoriesActivity : Activity(), KodeinAware { override lateinit var kodein: Kodein private val myFloat: Float by instance() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) kodein = (application as MyApplication).kodein }
ããããã£ãå§ä»»ããã«äŸåé¢ä¿ã«ã¢ã¯ã»ã¹ãã
äœããã®çç±ã§ããããã£ã®å§ä»»ã䜿çšããããªãå Žåã¯ãDKodein
ïŒçŽæ¥ããïŒçŽæ¥ã¢ã¯ã»ã¹ã䜿çšã§ããŸããäž»ãªéãã¯ãé
延åæåãæ¶ããŠããŸããŸããäŸåæ§ã¯ã³ãŒã«ã®æã«ããã«åŸãããããšãããinstance
ãprovider
ãã€åæ§ã®æ©èœãDKodein
æ¢åã®Kodeinã€ã³ã¹ã¿ã³ã¹ããååŸãããããŒãããæ§ç¯ã§ããŸãã class MyApplication : Application(), KodeinAware { override val kodein: Kodein = Kodein { bind<BigDecimal>() with singleton { BigDecimal.TEN } } val directKodein: DKodein = kodein.direct val directKodein2: DKodein = Kodein.direct { bind<BigDecimal>() with singleton { BigDecimal.ONE } } val someNumber:BigDecimal = directKodein.instance() val someNumber2:BigDecimal = directKodein2.instance()
Kodeinã¯ãã¬ãŒã ã¯ãŒã¯KodeinAware
ã§äœ¿çšã§ãDKodein
ããã¬ãŒã ã¯ãŒã¯DKodeinAware
ã§ã¯å®éšã§ããŸããä»»æã®ã³ã³ããã¹ãå
ã§äŸåé¢ä¿ãååŸããŸã
1ã€ã®ãªããžã§ã¯ãããKodein
åãã¿ã€ãã®ããã€ãã®äŸåé¢ä¿ãååŸããããã«ãåŒæ°ãæã€ã¿ã°ãšãã¡ã¯ããªãŒã䜿çšãããªãã·ã§ã³ãæ¢ã«æ€èšããŸãããããã1ã€ãããŸã-ã³ã³ããã¹ãã䜿çšããïŒããã¯Androidã®ã³ã³ããã¹ãã§ã¯ãããŸããïŒãã¿ã°ãšã®äŸåé¢ä¿ãšã®éãïŒ- ã¿ã°ã¯ãäŸåé¢ä¿ãäœæããé¢æ°å
ã§ã¯äœ¿çšã§ããŸãã
- ã³ã³ããã¹ãã䜿çšããå ŽåãäŸåé¢ä¿ãäœæããæ©èœã§ã³ã³ããã¹ãã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
å€ãã®å Žåãã³ã³ããã¹ãã®ä»£ããã«ãåŒæ°ä»ãã®ãã¡ã¯ããªã䜿çšã§ããŸããéçºè
Kodein
ã¯ã䜿çšãããã®ãããããªãå Žåã¯ãããè¡ãããšããå§ãããŸãããã ããã³ã³ããã¹ãã¯ãããšãã°ã2ã€ã®åŒæ°ãåãåã«ãã£ã¹ãã§ããªãå Žåã«åœ¹ç«ã¡ãŸããããšãã°ããšãActivity
ããPresenter
ã1ã€ã®ãªããžã§ã¯ãã䜿çšãKodein
ãŠãåãåã£ãã¯ã©ã¹ã«å¿ããŠãããŸããŸãªæ¹æ³ã§ããŸããŸãªã¿ã€ãã®ããã€ãã®äŸåé¢ä¿ãæäŸããå¿
èŠããããŸãããªãŒãã«Activity
ããPresenter
1çš®é¡ã«-ããªãã¯ãªãã·ã§ã³ã®ã€ã³ã¿ãã§ãŒã¹ãå¿
èŠãšããå·¥å Žã¯çµæã®åŒæ°ã®åããã§ãã¯ããå¿
èŠããããŸãããã®ã¹ããŒã ã¯ããŸã䟿å©ã§ã¯ãããŸããããããã£ãŠãã³ã³ããã¹ãã®äœ¿çšæ¹æ³ãèŠãŠã¿ãŸãããã class MyApplication : Application(), KodeinAware { override val kodein: Kodein = Kodein { bind<BigDecimal>() with contexted<CategoriesActivity>().provider { context.getActivityBigDecimal() } bind<BigDecimal>() with contexted<CategoriesPresenter>().factory { initialValue:BigDecimal -> context.getPresenterBigDecimal(initialValue) } } } class CategoriesActivity : Activity(), AppKodeinAware { fun getActivityBigDecimal() = BigDecimal("16.34") private val activityBigDecimal: BigDecimal by kodein.on(context = this).instance() } class CategoriesPresenter : AppKodeinAware { fun getPresenterBigDecimal(initialValue: BigDecimal) = initialValue * BigDecimal.TEN private val presenterBigDecimal: BigDecimal by kodein.on(context = this).instance(arg = BigDecimal("31.74")) }
ãã¡ãããäŸã¯è³ã®äžã«åŒã£åŒµãããå®éã«ã¯å®éã«ãã®ãããªç¶æ³ã«ééããããšã¯ã»ãšãã©ãããŸãããããã®äŸã¯ã³ã³ããã¹ããã©ã®ããã«æ©èœãããã瀺ããŠããŸããäŸåé¢ä¿ã宣èšããã«ã¯ã次ã®ããã«æå®ãããŠããªãwith provider()
ããšwith contexted<OurContextClass>().provider
ã©ãOurContextClass
-ã¯ã©ã¹ã®ãã®ã¿ã€ãã®ã³ããŒã¯ãã³ã³ããã¹ããšããŠæ©èœããŸããcontexted
ãããã€ããŒãŸãã¯ãã¡ã¯ããªãŒã®ã¿ã§ããäŸåé¢ä¿ãè¿ãé¢æ°å
ã®ãã®ã³ã³ããã¹ããžã®ã¢ã¯ã»ã¹ã¯ãååã®äžã®å€æ°ãä»ããŠè¡ãããŸãcontext
ãã³ã³ããã¹ãã«ã¢ã¿ãããããäŸåé¢ä¿ãååŸããã«ã¯ããŸãKodein
é¢æ°ã䜿çšããŠãªããžã§ã¯ãã®ã³ã³ããã¹ããæå®ããon()
次ã«äŸåé¢ä¿ãèŠæ±ããå¿
èŠããããŸããåæ§ã«ãã³ã³ããã¹ãã¯ã®å Žåã«äœ¿çšããinjection
ãŸãã private val productApi: IProductApi by kodein.on(context = someContext).newInstance { ProductApi(instance(), instance()) } }
Androidæ¡åŒµæ©èœ
èšäºã®åé ã§ãã®æ¡åŒµãªãã·ã§ã³ãæ€èšããããšãçŽæããŸããAndroid
ãäžã§èª¬æããããã«ãããã䜿çšããããšã劚ãããã®ã¯äœããããŸããKodein
ãããã¹ãŠããã䟿å©ã«ããããšãã§ããŸããAndroidåãã®çµã¿èŸŒã¿Kodein
éåžžã«äŸ¿å©ãªã®ã¯ãAndroidçšã«æºåãããã¢ãžã¥ãŒã«ã§ããæ¥ç¶ããã«ã¯ãã¯ã©ã¹ãããããã£ãé
延ããŠApplication
å®è£
KodeinAware
ããã³åæåããå¿
èŠããããŸãKodein
ïŒã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ããããApplication
ïŒããã®èŠè¿ããšããŠãå¿
èŠãªApplication
ãã®ãã¹ãŠãå«ããã¯ã©ã¹ããååŸã§ããèšå€§ãªæ°ã®å®£èšãããäŸåé¢ä¿ãååŸããŸãContext
ãæ¥ç¶æ¹æ³-äŸãèŠãŠãã ããã class MyApplication : Application(), KodeinAware { override val kodein = Kodein.lazy { import(androidModule(this@MyApplication))
ããªããèŠãããšãã§ããããã«-ããªãã¯ãããšãã°ãååŸããããšãã§ããŸãLayoutInflater
ãã¢ãžã¥ãŒã«ã§å®£èšãããŠããäŸåé¢ä¿ã®å®å
šãªãªã¹ãã«ã€ããŠã¯ããã¡ããã芧ãã ãããã³ã³ããã¹ããèªèããŠããAndroidã¯ã©ã¹ã®å€éšã§ãããã®äŸåé¢ä¿ãååŸããå Žåã¯ãã³ã³ããã¹ããæ瀺çã«æå®ããŸãã val inflater: LayoutInflater by kodein.on(context = getActivity()).instance()
ããã«æãè¿ãKodeinïŒïŒãä»ããŠèŠªKodeinãååŸããŸã
Androidã§ã¯ãäžéšã®ãªããžã§ã¯ãã¯ä»ã®ãªããžã§ã¯ãã«äŸåããŠããŸããæäžäœã«ã¯ã¢ããªã±ãŒã·ã§ã³ãããããã®äžã«ã¢ã¯ãã£ããã£ãããã次ã«ãã©ã°ã¡ã³ãããããŸããActivity KodeinAware
ã«å®è£
ããåæåãšããŠãåŒã³åºããŠããclosestKodein()
ã€ã³ã¹ã¿ã³ã¹ãååŸã§ããŸããKodein
Application
class MyActivity : Activity(), KodeinAware { override val kodein by closestKodein() val ds: DataSource by instance() }
closestKodein
Androidã¯ã©ã¹ã®å€éšã§ååŸããããšãã§ããŸãããé¢æ°ãåŒã³åºãããšãã§ããAndroidã³ã³ããã¹ããå¿
èŠã§ãã䜿çšããå Žåã¯KodeinAware
ããã®ã³ã³ããã¹ããæå®ããŸãïŒå¯Ÿå¿ããããããã£ããªãŒããŒã©ã€ãããAndroidã³ã³ããã¹ããé¢æ°ã«æž¡ããŸãkcontext()
ïŒã class MyController(androidContext: Context) : KodeinAware { override val kodein by androidContext.closestKodein() override val kodeinContext = kcontext(androidContext) val inflater: LayoutInflater by instance() }
ã¢ã¯ãã£ããã£ã§å¥ã®Kodeinãäœæãã
Activityã®èŠªKodeinããç¶æ¿ããŠå±éããå¿
èŠããããããããŸããã解決çã¯éåžžã«ç°¡åã§ãã class MyActivity : Activity(), KodeinAware { private val parentKodein by closestKodein() override val kodein: Kodein by Kodein.lazy { extend(parentKodein) } }
èšå®å€æŽäžã®ã³ãã€ã³
ã¯ããã§ããŸããããã«ã¯æ©èœãããretainedKodein
ãŸãã䜿çšããå ŽåKodein
ãæ§æã®å€æŽåŸã«ãªããžã§ã¯ãã¯åäœæãããŸããã class MyActivity : Activity(), KodeinAware { private val parentKodein by closestKodein() override val kodein: Kodein by retainedKodein { extend(parentKodein) } }
èšäºã§äœãèšãããŠããªãã®ã§ããïŒ
ç§ã¯å®å
šãªãµããããããã§ã¯ãªããç§èªèº«ã¯ããããè¿°ã¹ãããšããã»ã©ååã«ç解ããŠããªããåºæ¬çãªååãç¥ã£ãŠãèªåã§åŠã¶ããšãã§ãããã®ã®ãªã¹ãã¯æ¬¡ã®ãšããã§ãã- ã¹ã³ãŒã
- ã€ã³ã¹ã¿ã³ã¹ã®ãã€ã³ã
- ãã«ããã€ã³ãã£ã³ã°
- æºåå®äºã³ãŒã«ããã¯
- å€éšãœãŒã¹
- æ¶å»ãããããŒãžã§ã³ã®èœãšãç©Ž
- èšå®å¯èœãªã³ãã€ã³
- JSR-330ã®äºææ§
ããŠãããã¥ã¡ã³ããžã®ãªã³ã¯ïŒèªãã§ãããŠããããšãããã®èšäºãããªãã®åœ¹ã«ç«ã€ããšãé¡ã£ãŠããŸãïŒ