Javascript 有没有一种方法可以在NestJS中使用依赖项注入的静态方法?
一个例子比一个冗长的解释更好:Javascript 有没有一种方法可以在NestJS中使用依赖项注入的静态方法?,javascript,node.js,dependency-injection,nestjs,Javascript,Node.js,Dependency Injection,Nestjs,一个例子比一个冗长的解释更好: // Backery.service.ts import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Backery } from './Backery.entity'; @Injectable() export class Backe
// Backery.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Backery } from './Backery.entity';
@Injectable()
export class BackeryService {
constructor(
@InjectRepository(Backery)
private readonly backeryRepository: Repository<Backery>,
) {}
static myStaticMethodToGetPrice() {
return 1;
}
otherMethod() {
this.backeryRepository.find();
/* ... */
}
}
//Backery.service.ts
从'@nestjs/common'导入{Injectable};
从'@nestjs/typeorm'导入{InjectRepository};
从“typeorm”导入{Repository};
从“./Backery.entity”导入{Backery};
@可注射()
导出类后台服务{
建造师(
@注入存储库(Backery)
专用只读backeryRepository:Repository,
) {}
静态myStaticMethodToGetPrice(){
返回1;
}
其他方法(){
this.backeryRepository.find();
/* ... */
}
}
//Backery.resolver.ts
从“./Bakery.entity”导入{Bakery};
从“./Bakery.service”导入{BakeryService};
@分解器(()=>面包房)
出口级面包机{
构造函数(){}
@ResolveField('价格',()=>数字)
异步getPrice():承诺{
return BakeryService.myStaticMethodToGetPrice();//此处没有依赖项注入:(
}
}
我如何替换BakeryService.myStaticMethodToggetprice()来使用依赖注入,这样我就可以轻松地进行测试,例如?静态方法不能使用依赖注入。这是因为依赖注入的思想(至少是嵌套)是注入依赖项的实例,以便以后可以利用它们
您拥有的代码是有效的,因为它将返回值
1
,就像静态方法所说的那样,但是静态方法不能使用任何注入的实例值。您会发现这种逻辑在大多数其他DI框架中都遵循。静态方法不能使用依赖注入。这是因为dependenc的思想y注入(至少是嵌套)是注入依赖项的实例,以便以后可以利用它们
您拥有的代码是有效的,因为它会像静态方法所说的那样返回值
1
,但是静态方法不能使用任何注入的实例值。您会发现在大多数其他DI框架中都遵循这种逻辑。您希望这是一个静态方法,有什么特别的原因吗?换句话说,为什么你能不能在你的BakeryResolver
中注入BakeryService
并调用服务实例上的price方法?@eol该方法不使用this
,因此使其成为静态的感觉更自然,因为它不依赖于对象实例。你希望它成为静态的方法有什么特别的原因吗n换句话说,为什么您不能在BakeryResolver
中插入BakeryService
,并在服务实例上调用price方法?@eol该方法不使用this
,因此将其设为静态更为自然,因为它不依赖于对象实例。该代码有效,但它是官方推荐的吗ion?或者为了使用DI和简化测试,最好完全避免使用静态方法?对于动态模块,我喜欢避免使用静态**,除了**。此代码是有效的,但这是官方建议吗?或者为了使用DI和简化测试,最好完全避免使用静态方法?我喜欢避免使用静态**,除了**wh它涉及到动态模块。
// Backery.resolver.ts
import { Bakery } from './Bakery.entity';
import { BakeryService } from './Bakery.service';
@Resolver(() => Bakery)
export class BakeryResolver {
constructor() {}
@ResolveField('price', () => Number)
async getPrice(): Promise<number> {
return BakeryService.myStaticMethodToGetPrice(); // No dependency injection here :(
}
}