Nextjs Provider(Withロールと実装)


Nestjsのカスタマー・プロバイダとは?(Withロールと実装)


サンプルコードはgithubにあります!

Goal


  • カスタマー・プロバイダがなぜ現れたのかを理解する

  • カスタマー・プロバイダの使用方法
  • なぜカスタマープロバイダが必要ですか?


    前の文章に記載されているように、NestJsSpringとは異なり、InterfaceタイプはProviderに登録できません.
    調べてみると、すでにissueに問い合わせが登録されており、このissueは以下の回答とともに閉鎖されている.

    まとめてみると、Typescriptで定義されたInterfaceはコンパイル後に消失するため、InterfaceタイプはDIを受け入れることができない.

    ではNestjs役と実現に分けられないのでしょうか?


    結論から言えば分けられる.△Springと同様に、Interfaceの実装と@Beanの追加に比べて、少し面倒になるかもしれません.
    まず、@ComponentInterfaceとして登録すると、次のようになる.
    //ant-service.interface.ts
    export interface AntService {
        work(): void
    }
    
    //ant.service.ts
    @Injectable()
    export class AntServiceImpl implements AntService{
      work(): void {
        console.log('working hardly');
      }
    }
    
    //ant.moduel.ts
    @Module({
      controllers: [AntController],
      providers: [
        AntService
      ]
    })
    export class AntModule {}
    前述したように、codeを書くとProviderが見えます...!

    Custom Providerを使用してキャラクタを実装から分離

    compile errorは複数のNestJsを提供し、そのうちのCustom Providerを利用して分離します.ClassProviderが提供するNestJsは以下の通りである.
    export interface ClassProvider<T = any> {
        // export declare type InjectionToken = string | symbol | Type<any> | Abstract<any> | Function;
        provide: InjectionToken;
        useClass: Type<T>;
        scope?: Scope;
    }
    上記のClassProvider Interfaceに従ってInterfaceを作成し、CustomProviderに登録することができます.上記のModuleを使用してサンプルコードを記述します.
    const antService: ClassProvider = {
      provide: 'antService',
      useClass: AntServiceImpl
    } 
    
    @Module({
      controllers: [AntController],
      providers: [
        antService
      ]
    })
    export class AntModule {}
    このように、AntServiceを用いてClassProviderが作成され、CustomProviderに登録されている.では、このModuleを使用する場合は、以下のようなキャラクター(Provider)タイプでInterfaceを入力すればよい.
    @Controller('ant')
    export class AntController {
      // 이전과 달리 구현class를 의존하는 것이 아닌 interface를 의존할 수 있게 되었다.
      constructor(@Inject('antService') private readonly antService: AntService){}
    
      @Get()
      excuteWork(){
          this.antService.work();
      }
    }
    Providerを使用する前に、Custom ProviderAntControllerに直接注入されて使用される.AntServiceImplを用いて依存性を低減し、その後Custom Providerの実装体が変更されてもAntServiceで変更すればよい.

    整理する

    AntModuleを用いて、Custom Providerの中でNest역할をどのように区分すべきかを考察した.(구현の使用方法または詳細は、Custom Providerにおいて見出すことができる.)
    コード構造はCustom Provider역할に分けられ,その後拡張可能である.また、구현を修正する作業は減少します.Client Codeを記述する場合、Test Codeに依存するため、実装対象をカプセル化してテストすることができる.(テストに関する記事を書くときは、Interfaceを使用してユニットテストを行います.)

    Reference


  • https://docs.nestjs.com/fundamentals/custom-providers#custom-providers

  • https://wikidocs.net/150149