why
DI をして 各層で完全に分離された Unit テストを書くため。
以前のインスタンスたち
    val personsDriver = PersonsDriver()
    val personsGateway = PersonsGateway(personsDriver)
    val personsUsecase = PersonsUsecase(personsGateway)
    val persons = personsUsecase.getAllPersons()
これまでは Rest に 全てのインスタンスを作成して
class PersonsUsecase(val personsGateway: PersonsGateway) {
  fun getAllPersons():Persons {
    return personsGateway.getAllPersons()
  }
}
Usecase 以下では引数からインスタンスを受け取って使っていた。
Rest で Usecase を引数から読み込む
@RestController
class PersonHandler(
  val personsUsecase: PersonsUsecase
) {
Rest でも引数で Usecase のインスタンスを読み込むようにする。
ハンドラの一番上に書いてもこれだけだとクラスのインスタンスなどない。
@Component
class PersonsUsecase(
  val personsGateway: PersonsGateway,
) {
だが、Usecase に Component のアノテーションをつけることで、これはアプリが動いた直後に優先して取り込むものとして認識されるので、RestController の引数として受け取ることができる。
@Component
class PersonsGateway(
  val personsDriver: PersonsDriver
) {
@Component
class PersonsDriver {
Gateway と Driver でも同様に書く。
これで各層の引数に書いておけば、自動で各層が依存している層のインスタンスを使用できるようになった。
まとめ
Rest と Domain 以外の各層で Component アノテーションを書く。
そして Rest から Gateway まで引数に、依存する層のインスタンスを書く。
これで Rest で全ての層のインスタンスを作成しなくても依存する層のインスタンスが使えるようになる。
 

 
    
Top comments (0)