DEV Community

kaede
kaede

Posted on

Kotlin Springboot -- Part 5 Rest で全てのインスタンスを作って Driver まで動くようにする

why

companion object を使うと外から呼び出しやすいが、Unit テストを書く時にうまくいかないため。

全てクラスのメンバー関数で作って、そのインスタンスを作って使うように修正する。


REST

RestController で Template なしでシンプルにした。

personHoge = PersonHoge()
Enter fullscreen mode Exit fullscreen mode

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()
  }
}
Enter fullscreen mode Exit fullscreen mode

Image description


Usecase

Gateway のインスタンスを受け取るように作る。

class PersonsUsecase(val personsGateway: PersonsGateway) {
  fun getAllPersons():Persons {
    return personsGateway.getAllPersons()
  }
}
Enter fullscreen mode Exit fullscreen mode

Gateway

Usecase からインスタンスで呼び出すようになったため
comapanion object は必要なくなった。
渡された Driver のインスタンスを使って findAll した結果を return する。

class PersonsGateway(
  val personsDriver: PersonsDriver
) {
  fun getAllPersons():Persons {
    return personsDriver.findAll()
  }
}
Enter fullscreen mode Exit fullscreen mode

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
  }
}
Enter fullscreen mode Exit fullscreen mode

まとめ

Kotlin Springboot で
Rest <- Usecase <- Gateway <- Driver
と伝搬していくためには

Rest で
Driver のクラスから引数なしで Driver のインスタンスを作り
Gateway のクラスから Driver のインスタンスを引数にして Gateway のインスタンスを作り
Usecase のクラスから Gateway のインスタンスを引数にして Usecase のインスタンスを作り

Usecase のインスタンスの中身を使う。

Top comments (0)