NestJS에서 인터페이스 DI
18527 단어 TypeScriptNestJSditech
특정 반이 인터페이스를 물고 실시하려고 할 때 조금 막힌 것이 해결책이다.
하고 싶은 일
DemoService
에 대해 희망DI는 DemoRepositoryInterface
의DemoRepository
를 실현했다.demo.service.ts
import { Injectable } from '@nestjs/common';
import { DemoRepositoryInterface } from './demo.repository.interface';
@Injectable()
export class DemoService {
constructor(
private readonly demoRepository: DemoRepositoryInterface,
) {}
// その他メソッドなど...
}
인터페이스를 물지 않게 써볼게요.
상대방이 씹지 못하게 하는 것은 간단하다.
demo.service.ts
import { Injectable } from '@nestjs/common';
import { DemoRepository } from './demo.repository';
@Injectable()
export class DemoService {
constructor(
private readonly demoRepository: DemoRepository,
) {}
// その他メソッドなど...
}
demo.service.tsimport { Module } from '@nestjs/common';
import { DemoController } from './demo.controller';
import { DemoService } from './demo.service';
import { DemoRepository } from './demo.repository';
@Module({
controllers: [DemoController],
providers: [DemoService,DemoRepository],
})
export class DemoModule {}
NestJS 문서에 기재된standard providers
방법을 사용하면 실현할 수 있다.단, 이것은
DemoRepository
클래스가 클래스 이름과 같은 이름DemoRepository
의 영패로 호출될 수 있는 설정이다.따라서 서비스
DemoRepository
라고 할 수 있다.상술한 문서에도 기재되어 있는데 다음은 생략 형식이다.
demo.service.ts
import { Module } from "@nestjs/common";
import { DemoController } from "./demo.controller";
import { DemoService } from "./demo.service";
import { DemoRepository } from "./demo.repository";
@Module({
controllers: [DemoController],
providers: [
{
provide: DemoService,
useClass: DemoService,
},
{
provide: DemoRepository,
useClass: DemoRepository,
},
],
})
export class DemoModule {}
useClass
에서 선언한 것은 실제 유명이고, provide
에서 선언한 것은 어떤 이름으로 그 설정을 처리하는가.(문서에서 token
라고 함)useClass
에서만 같은 처리provide
문자열을 처리할 때 기록을 생략할 수 있습니다.따라서 서비스 측은 구조기
DemoRepository
를 통해 창고를 호출할 수 있다.인터페이스를 깨물고 써요.
demo.service.ts
import { Injectable } from '@nestjs/common';
import { DemoRepositoryInterface } from './demo.repository.interface';
@Injectable()
export class DemoService {
constructor(
private readonly demoRepository: DemoRepositoryInterface,
) {}
// その他メソッドなど...
}
인터페이스를 물게 하면 서비스 측DemoRepository
은 창고를 호출할 수 없습니다.따라서 문서에 기재된
Non-class-based provider tokens
를 사용했다.이 옵션을 사용하면 특정한 문자열을 특정한 종류의 영패와 연결할 수 있습니다.또한
Non-class-based
에 기재된 바와 같이 이 영패는 클래스에 기초하지 않고 @injectデコレータ
를 이용하여 서버에서 호출할 수 있다.공식 문서의 코드를 직접 가져오면 다음과 같다.
module
import { connection } from './connection';
@Module({
providers: [
{
provide: 'CONNECTION',
useValue: connection,
},
],
})
export class AppModule {}
서비스 방면의 구조기@Injectable()
export class CatsRepository {
constructor(@Inject('CONNECTION') connection: Connection) {}
}
이것을 이용하면인터페이스가 물린 상태에서DI를 진행할 수 있습니다.또한 공식 문서에 다음과 같은 내용이 기재되어 있어 상수문서에 영패를 지정했다.
demo.module.ts
import { Module } from "@nestjs/common";
import { DemoController } from "./demo.controller";
import { DemoService } from "./demo.service";
import { DemoRepository } from "./demo.repository";
import { ConstantTokens } from './demo.constants';
@Module({
controllers: [DemoController],
providers: [
{
provide: DemoService,
useClass: DemoService,
},
{
provide: ConstantTokens.REPOSITORY,
useClass: DemoRepository,
},
],
})
export class DemoModule {}
demo.service.tsimport { Inject, Injectable } from '@nestjs/common';
import { DemoRepositoryInterface } from './demo.repository.interface';
import { ConstantTokens } from './book.constants';
@Injectable()
export class DemoService {
constructor(
@Inject(ConstantTokens.REPOSITORY)
private readonly demoRepository: DemoRepositoryInterface,
) {}
// その他メソッドなど...
}
demo.constants.tsexport enum ConstantTokens {
REPOSITORY = 'repository',
}
이렇게 하면 인터페이스를 물어뜯어도 DI가 된다.기쁘고 축하할 만하다
참고 자료
Reference
이 문제에 관하여(NestJS에서 인터페이스 DI), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/10inoino/articles/805b35a6a995f9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)