NestJS 在非模块文件中注入模块服务
Posted
技术标签:
【中文标题】NestJS 在非模块文件中注入模块服务【英文标题】:NestJS Inject module service inside in a non module file 【发布时间】: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 ()
那么我应该如何在这个文件中注入服务呢?
【问题讨论】:
【参考方案1】:为了注入提供者,组件必须属于嵌套应用程序中的上下文(基本上是模块),基本上它必须是可注入, Controller、Async Provider 或 Custom 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();
这样就可以只处理该功能的一个实例
【讨论】:
以上是关于NestJS 在非模块文件中注入模块服务的主要内容,如果未能解决你的问题,请参考以下文章