Nestjs在useFactory中实例化服务类
我在检查nestjs模块的一个源代码()时发现了一些奇怪的东西。一致:Nestjs在useFactory中实例化服务类,nestjs,nestjs-services,nestjs-providers,Nestjs,Nestjs Services,Nestjs Providers,我在检查nestjs模块的一个源代码()时发现了一些奇怪的东西。一致: 当我们使用useFactory时,我们告诉我们在应用程序中使用ProviderService(无论注入令牌是什么)进行注入时,应该调用Nest函数。这似乎是因为app不是一个可立即注入的值(这可以通过将其设置为自定义提供程序来修复,但我猜nestjs firebase admin团队认为这是一个更简单的解决方案)。因此,firebase管理团队决定自己实例化提供者,而不是因为无法自动注入app而产生注入错误。这也是一种非常有
当我们使用
useFactory
时,我们告诉我们在应用程序中使用ProviderService
(无论注入令牌是什么)进行注入时,应该调用Nest函数。这似乎是因为app
不是一个可立即注入的值(这可以通过将其设置为自定义提供程序来修复,但我猜nestjs firebase admin
团队认为这是一个更简单的解决方案)。因此,firebase管理团队决定自己实例化提供者,而不是因为无法自动注入app
而产生注入错误。这也是一种非常有效的方法,并且像useFactory
这样的东西存在的原因(尽管,他们可以很容易地使用useValue:newproviderservice(app)
并避免使用所有功能)。这只是做事情的另一种方式非常感谢。是否可以添加首选方法(自定义提供程序)实现?(不需要精确的代码,我只想看看这个概念)我个人喜欢useClass
,因为在很多情况下(至少对于动态模块),它允许使用干净的模块。您还可以将factory函数提取到其他文件。这完全取决于形势的需要。需要注射吗<代码>使用类或使用工厂
。有一个你想使用但不想实例化的类吗<代码>使用类。需要传递一个字符串或对象吗<代码>使用值。我知道所有这些都有用例,当我们想在模块中注入对象时,我们使用useValue
,我们使用useClass
以同样的方式实现类。我们如何在这个场景中使用useClass
。所以我可以接受。但是仍然不知道useClass
和自定义提供程序实现:DIt取决于如何导出所有内容。您可以创建一个直接提供程序,只为提供的实例提供一个注入令牌,并使用@Inject(token)
注入它。创建这些包装器方法的服务只是为了(希望)实现更好的devxp,但需要注意
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),
}));
}
const PROVIDERS = [
FirebaseAuthenticationService,
FirebaseMessagingService,
FirebaseRemoteConfigService,
FirebaseDatabaseService,
FirebaseFirestoreService,
FirebaseStorageService,
];