Provider 的值也可以使用一个工厂函数生成。在这个 AppModule 模块里面,再配置一个 Provider,一个对象,先用 provide 设置一下这个 Provider 的 token ,可以使用一个字符串,比如 DEMO_FACTORY。
然后再添加一个 useFactory,这个属性的值是一个函数,这个函数返回的值就是这个 Provider 最终提供的东西。也就是你可以在这个函数里面,去准备 Provider 需要提供的东西。我们先简单的让这个工厂方法 return 一个字符串,Demo factory 。
打开 AppController,在它的构造方法里面,再注入一个依赖,因为要注入的 Provider 的 token 是一个字符串类型的值,所以需要用一下 @Inject 这个装饰器,给它一个字符串参数,值是 DEMO_FACTORY。把这个对应的 Provider 的值交给 demo 参数,值的类型是一个 string。
在这个构造方法里面,可以用一下 console.log ,输出 demo 参数的值。保存一下文件,回到运行项目开发服务的终端检查一下,你会发现,这里输出了一个 Demo factory 。这条信息是 Nest 在实例化 AppController 的时候输出的,信息的值就是 AppController 依赖的 DEMO_FACTORY 这个 Provider 的值。
依赖
在用工厂函数创建 Provider 的时候,可以额外给它添加这个工厂函数的依赖,配置这种 Provider 的时候,可以再添加一个 inject 属性,它的值是个数组,里面是工厂函数需要的依赖,比如添加一个 LOGGER 。
这样上面这个 useFactory 这个函数的第一个参数的值,就会是 LOGGER 这个 Provider,这里应该就是 LoggerService 类的一个实例。
方法里面,用一下 logger 上的 log 方法,输出一条信息,This message came from a provider factory.
回到终端,这里会输出一条控制台信息,This message came from a provider factory,输出这条信息的功能,是 DEMO_FACTORY 依赖的 LOGGER 上的一个方法提供的。