我有一个应用程序,它接收一个服务作为对控制器的依赖,到目前为止一切都很好,但我想找到一种方法,而不是声明该服务的具体实现,以便能够从控制器“询问”该服务实现的接口,用于解耦该服务的具体实现。在 Nest js 中这是如何完成的?
Jas*_*ite 14
为此,您必须为您的界面创建一个注入令牌,并@Inject()在注入服务时将装饰器与注入令牌一起使用。然后在您的模块中,您可以声明为该注入令牌提供哪个实现。
下面是一个简单的问候服务接口和我们的注入令牌,它将在将我们的服务注册为提供商时使用。
// This will be our injection token.
export const GREETING_SERVICE = 'GREETING SERVICE';
export interface IGreetingService {
greet(name: string): Promise<string>;
}
Run Code Online (Sandbox Code Playgroud)
将实现我们的问候界面的基本服务......
// This will be our injection token.
export const GREETING_SERVICE = 'GREETING SERVICE';
export interface IGreetingService {
greet(name: string): Promise<string>;
}
Run Code Online (Sandbox Code Playgroud)
还有我们的问候模块,我们使用令牌注册我们的服务......
import { Injectable } from '@nestjs/common';
import { IGreetingService } from './greeting-service.interface';
@Injectable()
export class ProfessionalGreetingService implements IGreetingService {
public async greet(name: string): Promise<string> {
return `Hello ${name}, how are you today?`;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我们注入服务时,我们可以将@Inject()装饰器与注入令牌一起使用。useClass无论您在我们的系统中提供了哪种实现,都GreetingModule将被注入......
import { Module } from '@nestjs/common';
import { ProfessionalGreetingService } from './services/professional-greeting.service';
import { GREETING_SERVICE } from './services/greeting-service.interface';
import { GreetingController } from './controllers/greeting.controller';
@Module({
providers: [
{
// You can switch useClass to different implementation
useClass: ProfessionalGreetingService,
provide: GREETING_SERVICE
}
],
controllers: [
GreetingController
]
})
export class GreetingModule {}
Run Code Online (Sandbox Code Playgroud)
https://github.com/jmw5598/nestjs-di-decoupling-with-interfaces https://docs.nestjs.com/fundamentals/custom-providers
| 归档时间: |
|
| 查看次数: |
7195 次 |
| 最近记录: |