Nest JS 同一提供程序的两个实例

typescriptJS

2个回答

写回答

Mnchoi

2025-09-17 19:40

+ 关注

JS
JS

使用Nest JS可以轻松地创建可扩展的、模块化的Web应用程序。在Nest JS中,提供程序是一个关键概念,它允许我们通过依赖注入的方式将各种依赖项注入到我们的应用程序中。有时候,我们可能需要在同一提供程序中创建多个实例,以便在不同的上下文中使用它们。在本文中,我们将探讨如何在Nest JS中创建同一提供程序的两个实例,并提供一个案例代码来说明这个过程。

首先,让我们了解一下为什么需要在同一提供程序中创建多个实例。有时候,我们可能需要在应用程序的不同模块或组件中使用相同的提供程序,但是它们需要具有不同的配置或状态。在这种情况下,我们可以通过创建多个实例来满足这个需求。

为了创建同一提供程序的多个实例,我们需要使用自定义的提供程序装饰器。这个装饰器允许我们为每个实例指定不同的配置或状态。下面是一个示例代码,展示了如何创建同一提供程序的两个实例:

typescript

// 创建自定义的提供程序装饰器

const CustomProvider = (name: string) => {

return (target: any) => {

Injectable()(target);

Provider()(target);

Reflect.defineMetadata('name', name, target);

};

};

// 创建具有不同配置的两个提供程序实例

@CustomProvider('providerA')

class ProviderA {}

@CustomProvider('providerB')

class ProviderB {}

// 在模块中使用多个实例

@Module({

providers: [ProviderA, ProviderB],

})

class AppModule {}

在上面的代码中,我们创建了两个具有不同配置的提供程序实例:ProviderAProviderB。通过使用自定义的提供程序装饰器 CustomProvider,我们可以为每个实例指定一个唯一的名称,以便在其他模块中引用它们。

在Nest JS的模块中,我们可以使用这些提供程序实例。下面是一个示例代码,展示了如何在模块中使用这两个实例:

typescript

@Module({

imports: [],

controllers: [],

providers: [],

})

export class AppModule implements NestModule {

constructor(

@Inject('providerA') private readonly providerA: ProviderA,

@Inject('providerB') private readonly providerB: ProviderB,

) {}

configure(consumer: MiddlewareConsumer) {

// 在中间件中使用ProviderA

consumer.apply(MiddlewareA).forRoutes('*');

// 在路由处理程序中使用ProviderB

consumer

.apply(MiddlewareB)

.forRoutes({ path: 'example', method: RequestMethod.GET });

}

}

在上面的代码中,我们在AppModule中通过使用@Inject装饰器来注入两个提供程序实例:providerAproviderB。然后,我们可以在模块的其他地方使用这些实例,例如在中间件或路由处理程序中。

案例代码的解析

在上面的案例代码中,我们首先定义了一个自定义的提供程序装饰器 CustomProvider。这个装饰器接受一个字符串参数 name,用于指定提供程序实例的名称。然后,我们在装饰器函数中使用 InjectableProvider 装饰器来标记提供程序类。最后,我们使用 Reflect.defineMetadata 方法将提供程序实例的名称存储在元数据中。

然后,我们创建了两个具有不同配置的提供程序实例 ProviderAProviderB。通过使用自定义的提供程序装饰器 CustomProvider,我们为每个实例指定了一个唯一的名称。

AppModule 中,我们通过使用 @Inject 装饰器来注入这两个提供程序实例。然后,我们可以在模块的其他地方使用这些实例,例如在中间件或路由处理程序中。

在本文中,我们了解了如何在Nest JS中创建同一提供程序的多个实例。通过使用自定义的提供程序装饰器,我们可以为每个实例指定不同的配置或状态。这种方法可以帮助我们更好地组织和管理我们的应用程序中的依赖项,并提供更大的灵活性和可扩展性。

举报有用(4分享收藏

蛰玉

2025-09-20 17:55

+ 关注

在Nest JS中,同一提供程序的两个实例通常是由于提供程序的生命周期和作用域设置不当导致的。Nest JS默认情况下为每个请求创建提供程序的一个新实例,但如果将提供程序的作用域设置为单例(Singleton),那么在整个应用程序中只会有一个该提供程序的实例。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号