DI는 (기본적으로)주입받은 해당 클래스의 기능만 사용합니다

조민호·2023년 1월 22일
0
class NetworkClient {
  
  // 네트워크 연결을 진행하는데, 에러가 뜨는 메소드
  tryConnect(): void {
    throw new Error('no network!');
  }
}

class UserService {

  // DI!!
  constructor(private client: NetworkClient) {}

  // DI로 받은 tryConnect()메소드를 사용하고 login()하는 함수
  login() {
    this.client.tryConnect()
  }
}

class App {

  // DI!!
  constructor(private userService: UserService) {}

  run(){
    this.userService.login()
  }
}
  • UserService 는 NetworkClient를 주입받아서 NetworkClient의 tryConnect()를 사용합니다
  • App 은 UserService를 주입받아서 UserService의 login()을 사용합니다

NetworkClient ⇒ UserService ⇒ App 의 형태인 것입니다



그렇지만 App 에서 NetworkClient의 tryConnect()를 사용할 수는 없습니다

NetworkClient ⇒ UserService ⇒ App 형태로 DI가 됐는데

App에서 주입받은 UserService가 NetworkClient를 주입받고 있다고 해서, App에서 NetworkClient의 것까지 사용할 수는 없는 것입니다

물론, 상속을 하거나 인터페이스를 사용하게 되면 App에서 NetworkClient의 것까지 사용이 가능하게 되지만, 기본적으로는 사용이 안 된다는 것입니다



상속 사용시

class NetworkClient {
  
  // 네트워크 연결을 진행하는데, 에러가 뜨는 메소드
  tryConnect(): void {
    throw new Error('no network!');
  }
}

class UserService **extends NetworkClient**{

  // DI!!
  constructor(private client: NetworkClient) {
    super()
  }

  // DI로 받은 tryConnect()메소드를 사용하고 login()하는 함수
  login() {
    this.client.tryConnect()
  }
}

class App {

  // DI!!
  constructor(private userService: UserService) {}

  run(){
    this.userService**.tryConnect()**
  }
}
profile
웰시코기발바닥

0개의 댓글