Nest는 내부 providers 목록을 탐색하고 해당 주입 토큰을 조회 키로 사용하여 모든 provider에 대한 참조를 얻을 수 있는 ModuleRef 클래스를 제공합니다. ModuleRef 클래스는 정적 및 범위 지정 providers를 모두 동적으로 인스턴스화하는 방법도 제공합니다. ModuleRef는 일반적인 방법으로 클래스에 주입할 수 있습니다.
ModuleRef 인스턴스(이하 module reference)에는 get() 메서드가 있습니다. 이 메서드는 인젝션 토큰/클래스 이름을 사용하여 현재 모듈에 존재하는(인스턴스화된) provider, controller 또는 인젝터블(예: guard, interceptor 등)을 검색합니다.
🚨
WARNING
get() 메서드에서는 범위가 지정된 providers(일시적 또는 요청 범위)를 검색할 수 없습니다. 대신 아래에 설명된 기술을 사용하세요. 여기에서 범위를 제어하는 방법을 알아보세요.
글로벌 컨텍스트에서 provider를 검색하려면(예: provider가 다른 모듈에 삽입된 경우) { strict: false } 옵션을 get()의 두 번째 인수로 전달합니다.
범위가 지정된 provider(일시적 또는 요청 범위)를 동적으로 확인하려면 provider의 인젝션 토큰을 인수로 전달하여 resolve() 메서드를 사용합니다.
resolve() 메서드는 자체 DI 컨테이너 하위 트리에서 공급자의 고유한 인스턴스를 반환합니다. 각 하위 트리에는 고유한 컨텍스트 식별자가 있습니다. 따라서 이 메서드를 두 번 이상 호출하고 인스턴스 참조를 비교하면 동일하지 않다는 것을 알 수 있습니다.
여러 번의 resolve() 호출에 걸쳐 단일 인스턴스를 생성하고 생성된 동일한 DI 컨테이너 하위 트리를 공유하도록 하려면 resolve() 메서드에 컨텍스트 식별자를 전달하면 됩니다. 컨텍스트 식별자를 생성하려면 ContextIdFactory 클래스를 사용합니다. 이 클래스는 적절한 고유 식별자를 반환하는 create() 메서드를 제공합니다.
요청 컨텍스트 내에서 요청 범위가 지정된 provider의 인스턴스를 확인해야 하는 경우가 있습니다. CatsService가 요청 범위가 지정되어 있고 요청 범위가 지정된 provider로 표시된 CatsRepository 인스턴스를 확인하고자 한다고 가정해 보겠습니다. 동일한 DI 컨테이너 하위 트리를 공유하려면 새 컨텍스트 식별자를 생성하는 대신 현재 컨텍스트 식별자를 가져와야 합니다(예: 위 그림과 같이 ContextIdFactory.create() 함수를 사용). 현재 컨텍스트 식별자를 가져오려면 @Inject() 데코레이터를 사용하여 요청 객체를 주입하는 것으로 시작하세요.