【问题标题】:NestJS Inject module service inside in a non module fileNestJS 在非模块文件中注入模块服务
【发布时间】:2019-12-26 15:53:16
【问题描述】:

我有一个用于视图渲染的函数文件,我想在这里使用 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() { }
}

当我尝试在这里创建新类时,出现错误“预期 1 个参数但得到 0”

我的 MemberService 是这样的

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

那么我应该如何在这个文件中注入服务呢?

【问题讨论】:

    标签: javascript typescript dependency-injection nestjs inversifyjs


    【解决方案1】:

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

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

    请记住,这是服务的另一个实例,如果您不注意,您将在运行时拥有多个实例,因为它不再是可注入的,而是类对象。为了防止这种情况,您可以创建一个包含所有 MemberService 功能的 singleton 并将其导入 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();
      }
    }
    

    这样就可以只处理该功能的一个实例

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 2019-01-20
      • 2021-04-01
      • 2022-11-14
      • 2015-12-02
      • 2020-12-11
      • 2022-08-08
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多