你能在Angular / NestJS模块提供程序中使用' useFactory '属性并返回一个类而不是一个实例吗?&



我正在使用NestJS构建一个API。我有一个通往第三方API的Gateway服务,该API将HTTP调用与数据处理逻辑解耦。因为我不想在开发期间向API发出请求,所以我使用了一个工厂函数,该函数根据环境返回一个Gateway类——tinkmockgateway或TinkGateway。

在工厂函数中,我返回类而不是实例,它可以工作。这很令人惊讶,因为我的实现与Angular/NestJS文档不同。在两个文档[1,2]中,都说必须返回想要注入的类的一个实例——如果我们遵循工厂模式,这是有意义的。

但是,当我使用下面的工厂函数(NestJS)时,依赖项会根据环境正确注入(网关)。

// other module providers...
{
provide: TinkGateway,
useFactory: () => environment.mockTinkGateway ? TinkMockGateway : TinkGateway,
}

是框架为我创建实例还是正在发生什么?

这是不一样的

通过使用DI的useFactory方法,您必须返回一个实例。这就是工厂模式所说的,似乎也是Angular/NestJS开发者所期望的。

如果您使用useFactory,然后返回一个类(而不是一个实例),那么您将获得依赖于网关的类中的类。但是,您需要的是一个(可能是共享的)实例。毕竟,这就是依赖注入的目的。请看下面的两个console.dir示例:

  1. 使用类(与您的问题相同的代码):
// bank.repository.ts
//
// Adding a console.dir to see what's the output
@Injectable()
export class BankRepository implements IBankRepository {
constructor(private tinkGateway: TinkGateway) {
console.dir(tinkGateway);
}
}
// Output
>>> [Function: TinkGateway]
  1. 使用实例:
// Adding the following provider in the module
// (substituting your previous provider).
// ...other providers
{
provide: TinkGateway,
useFactory: () =>
environment.mockTinkGateway
? new TinkMockGateway()
: new TinkGateway(),
inject: [HttpService, ConfigService],
},
// more providers...
// Output
>>> TinkGateway {}

最新更新