繁体   English   中英

NestJS 在非模块文件中注入模块服务

[英]NestJS Inject module service inside in a non module file

我有一个用于视图渲染的 function 文件,我想在这里使用 nestjs 模块服务。 我的渲染文件是这样的。

export default {
  parse() { }
  render() { }
}

所以为了在这里使用模块服务,我试着像这样注入。

import { Inject } from '@nestjs/common';
import { MemberService } from './member.service';

class SampleClass {
  constructor(@Inject('MemberService') private readonly memberService: MemberService) {}
}

// Creating class in here to use in functions
const sampleService = new SampleClass();

export default {
  parse() { }
  render() { }
}

当我尝试在此处创建新的 class 时出现错误“Expected 1 arguments but got 0”

我的会员服务是这样的

@Injectable()
export class MemberService {
  constructor(@Inject(Constants.RelationshipMemberModel) private readonly relationshipMemberModel: typeof Model) {}
  login () {}
}

那么我应该如何注入服务以在此文件中使用?

为了注入提供程序,组件必须属于嵌套应用程序中的上下文 (基本上是模块),基本上它必须是或InjectableControllerAsync ProviderCustom Async Provider ,并且必须属于它可以访问您要注入的提供程序的模块。 为了在不在上下文中的外部javascript类中使用服务的功能,您可以导入服务,并且必须在此处自行实例化它,您可以使用此方法的示例:

class SampleClass {
  private memberService: MemberService; 
  constructor() {
    this.memberService = new MemberService();
  }
}

请记住,这是该服务的另一个实例,如果您不注意,则会在运行时拥有多个实例,因为它不再是可注入的,而是一个类对象。 为了防止这种情况,您可以创建一个包含所有MemberService功能的单例 ,并将其导入MemberService和SampleClass中:

export class MemberFunctionality {
  private static memberFunctionality: MemberFunctionality;
  private constructor() {}
  static getInstance(): MemberFunctionality {
    if(!memberFunctionality) {
      this.memberFunctionality = new MemberFunctionality();
    }
    return this.memberFunctionality;
  }
  login() {}
}

然后将其导入MemberService和SampleClass上,并调用getInstance方法

import { MemberFunctionality } from './member-functionality.ts';

class SampleClass {
  private memberFunctionality: MemberFunctionality;
  constructor() {
    this.memberFunctionality = MemberFunctionality.getInstance();
  }
  ...
}

MemberService也是如此

import { MemberFunctionality } from './member-functionality.ts';

@Injectable()
export class MemberService {
  private memberFunctionality: MemberFunctionality;
  constructor(@Inject(Constants.RelationshipMemberModel) private readonly relationshipMemberModel: typeof Model) {
    this.memberFunctionality = MemberFunctionality.getInstance();
  }
  login () {
    return this.memberFunctionality.login();
  }
}

这将只包含该功能的一个实例

我用两种不同的方式做到了

  1. 在你的模块中,监听OnApplicationBootstrap并自己手动注入

     import { Module, OnApplicationBootstrap } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; import { SampleClass } from 'src/commons/SampleClass'; import { MemberService } from 'src/module/MemberService'; export class YourAwesomeModule implements OnApplicationBootstrap { constructor(private moduleRef: ModuleRef) {} onApplicationBootstrap() { // implement singleton here const sampleClass = SampleClass.getInstance(); const memberService = this.moduleRef.get(MemberService); sampleClass.setMemberService(memberService); } }

实际上,如果不需要分离,您可以将this从 MemberService 的构造函数传递到 SampleClass 中。

  1. 对于类似的情况(在不同模块之间传递实例),我使用 UseGuard,添加实例以从另一个模块请求 object,并在控制器/服务 class 中使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM