why
companion object を使うと外から呼び出しやすいが、Unit テストを書く時にうまくいかないため。
全てクラスのメンバー関数で作って、そのインスタンスを作って使うように修正する。
REST
RestController で Template なしでシンプルにした。
personHoge = PersonHoge()
PersonHoge というクラスを使って変数を作ることで、
そのクラスのインスタンスを作ることができる。
これでまずは Driver のインスタンスを引数なしで作成する。
次に Gateway のインスタンスを、Driver のインスタンスを引数に渡して作成する。
さらに Usecase のインスタンスを、Gateway のインスタンスを引数に渡して作成する。
作成された Usecase のインスタンスの中のメンバ関数の getAllPersons を呼び出して、中身をとって return する。
これで companion object を使わなくても
Usecase で Gateway が呼べて
Gateway で Driver が呼べる。
@RestController
class PersonHandler {
@GetMapping("/")
fun root(): String {
return "index2"
}
@GetMapping("/persons")
@ResponseBody
fun getPersons(): String {
val personsDriver = PersonsDriver()
val personsGateway = PersonsGateway(personsDriver)
val personsUsecase = PersonsUsecase(personsGateway)
val persons = personsUsecase.getAllPersons()
print(persons)
return persons.toString()
}
}
Usecase
Gateway のインスタンスを受け取るように作る。
class PersonsUsecase(val personsGateway: PersonsGateway) {
fun getAllPersons():Persons {
return personsGateway.getAllPersons()
}
}
Gateway
Usecase からインスタンスで呼び出すようになったため
comapanion object は必要なくなった。
渡された Driver のインスタンスを使って findAll した結果を return する。
class PersonsGateway(
val personsDriver: PersonsDriver
) {
fun getAllPersons():Persons {
return personsDriver.findAll()
}
}
Driver
最終地点なので何もインスタンスを受け取らない。
companion だけ解除した。
class PersonsDriver() {
private val data:Persons = Persons(listOf(
(Person(Name("taro"), Age(12))),
(Person(Name("hanako"), Age(10))),
))
fun findAll():Persons {
return data
}
}
まとめ
Kotlin Springboot で
Rest <- Usecase <- Gateway <- Driver
と伝搬していくためには
Rest で
Driver のクラスから引数なしで Driver のインスタンスを作り
Gateway のクラスから Driver のインスタンスを引数にして Gateway のインスタンスを作り
Usecase のクラスから Gateway のインスタンスを引数にして Usecase のインスタンスを作り
Usecase のインスタンスの中身を使う。
Top comments (0)