Tah*_*gun 5 javascript dependency-injection typescript inversifyjs nestjs
我有一个用于视图渲染的函数文件,我想在这里使用 nestjs 模块服务。我的渲染文件是这样的。
export default {
parse() { }
render() { }
}
Run Code Online (Sandbox Code Playgroud)
所以要在这里使用模块服务,我尝试像这样注入。
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() { }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在这里创建新类时出现错误“预期有 1 个参数但得到 0”
我的会员服务是这样的
@Injectable()
export class MemberService {
constructor(@Inject(Constants.RelationshipMemberModel) private readonly relationshipMemberModel: typeof Model) {}
login () {}
}
Run Code Online (Sandbox Code Playgroud)
那么我应该如何注入服务以在此文件中使用?
为了注入提供程序,组件必须属于嵌套应用程序中的上下文(基本上是一个模块),基本上它必须是Injectable、Controller、Async Provider或Custom Async Provider,并且它必须属于它可以访问您尝试注入的提供程序的模块。为了在不在上下文中的外部 javascript 类中使用服务的功能,您可以导入该服务,并且必须自己实例化它,这里您可以看到这种方法的示例:
class SampleClass {
private memberService: MemberService;
constructor() {
this.memberService = new MemberService();
}
}
Run Code Online (Sandbox Code Playgroud)
请记住,这是服务的另一个实例,如果您不小心,您将在运行时拥有多个实例,因为它不再是可注入的,而是一个类对象。为了防止这种情况,您可以创建一个包含所有 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() {}
}
Run Code Online (Sandbox Code Playgroud)
然后将其导入到 MemberService 和 SampleClass 上并调用 getInstance 方法
import { MemberFunctionality } from './member-functionality.ts';
class SampleClass {
private memberFunctionality: MemberFunctionality;
constructor() {
this.memberFunctionality = MemberFunctionality.getInstance();
}
...
}
Run Code Online (Sandbox Code Playgroud)
会员服务也是如此
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这样就可以只拥有该功能的一个实例
| 归档时间: |
|
| 查看次数: |
3815 次 |
| 最近记录: |