DEV Community

kaede
kaede

Posted on

Kotlin Springboot -- Part 8 インスタンスの作成を Component 機能を使って Dependency Injection が自動で行われるようにする

why

DI をして 各層で完全に分離された Unit テストを書くため。


以前のインスタンスたち

    val personsDriver = PersonsDriver()
    val personsGateway = PersonsGateway(personsDriver)
    val personsUsecase = PersonsUsecase(personsGateway)
    val persons = personsUsecase.getAllPersons()
Enter fullscreen mode Exit fullscreen mode

これまでは Rest に 全てのインスタンスを作成して

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

Usecase 以下では引数からインスタンスを受け取って使っていた。


Rest で Usecase を引数から読み込む

@RestController
class PersonHandler(
  val personsUsecase: PersonsUsecase
) {
Enter fullscreen mode Exit fullscreen mode

Rest でも引数で Usecase のインスタンスを読み込むようにする。
ハンドラの一番上に書いてもこれだけだとクラスのインスタンスなどない。

@Component
class PersonsUsecase(
  val personsGateway: PersonsGateway,
) {
Enter fullscreen mode Exit fullscreen mode

だが、Usecase に Component のアノテーションをつけることで、これはアプリが動いた直後に優先して取り込むものとして認識されるので、RestController の引数として受け取ることができる。

@Component
class PersonsGateway(
  val personsDriver: PersonsDriver
) {
Enter fullscreen mode Exit fullscreen mode
@Component
class PersonsDriver {
Enter fullscreen mode Exit fullscreen mode

Gateway と Driver でも同様に書く。
これで各層の引数に書いておけば、自動で各層が依存している層のインスタンスを使用できるようになった。


まとめ

Rest と Domain 以外の各層で Component アノテーションを書く。

そして Rest から Gateway まで引数に、依存する層のインスタンスを書く。

これで Rest で全ての層のインスタンスを作成しなくても依存する層のインスタンスが使えるようになる。

Top comments (0)