在 Nest 框架的类里面可以注入它依赖的功能,Nest 在创建这个类的实例的时候,发现这个类里面有依赖的东西,如果这个依赖的东西是一个类,Nest 就会去创建这个被依赖的类的一个实例。
在默认情况下,Nest 只会创建一个被依赖的类的实例。在应用里面,可能会在多个类里面依赖同样的东西,这个被依赖的东西如果是个类,Nest 只会创建一个它的实例,也就是在我们的应用里面,这些被依赖的类,只会存在一个实例,这就是 Singleton,中文可以翻译成单例,就是单个实例的意思。
验证
下面我们可以验证一下,先打开 AppModule 模块,改造一下配置的 Provider,去掉 DEMO_FACTORY,这个 LOGGER 可以直接换成 LoggerService。如果 Provider 的 token 值与 useClass 的值是同一个类,可以使用一个简写的形式,直接添加一个类就行了。上面这个 AppService 也可以改成同样的形式。
然后打开 AppController,修改一下给这个类注入的依赖,去掉 DEMO_FACTORY,然后用参数属性注入 LoggerService 依赖。
在这个控制器的 getHello 方法里面,用一下 this.logger.log 方法,输出一条信息,AppController: getHello。
再打开 AppService ,这个类也同样依赖 LoggerService,把注入依赖的方法换成参数属性。
现在 AppController 还有 AppService 这两个类,都需要 LoggerService 提供的服务,所以我们把它作为这两个类的依赖注入进来。
打开 LoggerService 这个类,可以给它添加一个构造方法,constructor ,在这个构造方法里面,用 console.log 在控制台上输出一条信息,比如 LoggerService: initialzed. 这样 Nest 在实例化这个类的时候,就会在控制台上输出这条信息。
预览
打开一个 Http 客户端,先请求一下应用的根。然后回到运行项目开发服务的终端观察一下。这里输出了 AppController: getHello,还有 AppService: Hello World 。这就说明,在 AppController 还有 AppService 这两个类里成功注入了它们依赖的 LoggerService。
这里你还会发现,输出了一个 LoggerService: initialized 这条信息,这是我们在 LoggerService 类的构造方法里设置的要做的事情。每次实例化这个类的时候,都会输出这条信息,这里只输出了一条这个信息,也就说明这个类只被实例化了一次。
Nest 在实例化类的时候,会检查它们的依赖。比如在实例化 AppController 的时候,发现它有 LoggerService 这个依赖,对应的东西是个类,Nest 就会去创建一个这个类的实例,放到自己的 IoC Container 里面。再创建 AppService 类的实例的时候,又发现它依赖 LoggerService,Nest 会到自己的 IoC Container 里面直接把之前创建的 LoggerService 类的实例拿出来,注入到 AppService 这个类里面。