Nestjs 在 useFactory 中实例化服务类

问题描述

我正在检查 nestjs 模块的源代码之一 (nestjs-firebase-admin),我看到了一些奇怪的东西。在 this 行中:

  private static createProviders(app: admin.app.App): Provider<any>[] {
    return PROVIDERS.map<Provider>((ProviderService) => ({
      provide: ProviderService,// here,instantiate each service class
      useFactory: () => new ProviderService(app),}));
  }

他们为什么要实例化每个服务类?这应该由嵌套核心处理。据我所知,我们只是在包装另一个本机插件时实例化普通的 js 类。但这些是 nestjs 服务。所以我们不应该手动实例化它们。有什么想法吗?

注意: PROVIDERS 定义为(都是服务):

const PROVIDERS = [
  FirebaseAuthenticationService,FirebaseMessagingService,FirebaseRemoteConfigService,FirebaseDatabaseService,FirebaseFirestoreService,FirebaseStorageService,];

解决方法

当我们使用 useFactory 时,我们告诉当在应用程序中使用 ProviderService(无论注入令牌可能是什么)进行注入时,应调用 Nest 函数。看起来这样做的原因是 app 不是可立即注入的值(这可以通过将其设置为自定义提供程序来解决,但我猜 nestjs-firebase-admin 团队认为这是一个更简单的解决方案)。因此,firebase-admin 团队没有出现无法自动注入 app 的注入错误,而是决定自己实例化提供程序。这也是一种完全有效的方法,这也是 useFactory 之类存在的原因(不过,他们可以轻松使用 useValue: new ProviderService(app) 并完全避免使用该函数)。这只是另一种做事的方式

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...