问题描述
我正在检查 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)
并完全避免使用该函数)。这只是另一种做事的方式