おじゃまぷよ系エンジニアメモ

アプリエンジニアからサーバーとインフラエンジニアに転身しました

kotlinでワンソースのDIコンテナ試しに書いた

やっと仕事落ち着いてきたので軽く何かkotlin書きたいなあと思ってモヤモヤして、そういえば以前からDagger2も取り入れてAndroidアプリ開発したいなぁと思っていたが
なんかDagger2の使い方がややこしくて、逆に複雑度が増す感じがして個人で小規模な開発には正直メリットを見いだせなかった。純粋に勉強不足というものもあるがもっとゆるーいDIコンテナ欲しいなと考えたり他のDIコンテナってどんな感じなんだろうと思って色々調べてるうちに、PHPの軽量なDIコンテナのPimpleに出会った
なるほど……オブジェクトを生成する関数をDIコンテナに配列で保存しておいて必要になったらそのコンテナに保存しておいた関数でオブジェクトを生成するという感じか
これぐらいゆるい感じで軽量なら同じようなことがkotlinでもできそうだなと思い立ってとりあえず書いた

GitHub - masahide318/Kontainer

koRegister(String,()->Any)でオブジェクトの生成方法を保存しておき、koInject(String)でオブジェクトを生成して返す koInjectSingleton(String)で取得すれば、singletonとしてオブジェクトを取得できる 使い方はReadmeにも書いてある通り以下の様な感じ

class SampleObj(val id: Int, val name: String) {
}

koRegister("sample",{SampleObj(1,"hoge")})

//inject with new Object
val sampleObj1:SampleObj = koInject("sample")
val sampleObj2:SampleObj = koInject("sample")
//別のインタンスとして取得できる
println(sampleObj1 === sampleObj2) //false

//inject with singleton
val singleton1:SampleObj = koInjectSingleton("sample")
val singleton2:SampleObj = koInjectSingleton("sample")
//シングルトンとして同一オブジェクトが帰る
println(singleton1 === singleton2) // true

Androidの開発で果たして使えるのか、恐らくApplicationクラスのonCreateでサービスクラス系をこいつにぶち込む感じになるんだろうが
まぁ試しに使って見ながら余裕があれば色々改良してみよう