在 Nest 框架里面,使用了依赖注入这种设计模式,它可以让我们设计出更灵活、强大,更容易被测试还有维护的应用。我们在开发基于 Nest 框架的后端应用的时候,可以很方便的使用依赖注入这些设计模式,只需要知道,怎么样在类里面注入它依赖的东西就行了,剩下的复杂的事情都可以交给 Nest 框架去处理。
先了解一下怎么样在 Nest 框架里使用依赖注入。打开我们之前创建的这个全新的 Nest 项目,先打开项目里的 src 下面的 app.controller.ts,新创建的 Nest 项目里,会有这样一个控制器。
这个控制器里定义了一个支持 HTTP 的 GET 方法请求的路由,地址就是应用的根。访问这条路由的处理方法是 getHello,这个方法返回的东西就是请求这个路由响应的内容。这里用了一下 appService 上的 getHello 方法返回的值。
在 Nest 框架里,控制器一般只处理 Http 请求,具体要做的事情可以交给服务去做,所以我们会单独给这个 AppController 控制器创建一个对应的服务,这个服务就是 AppService。也就是 AppController 会依赖 AppService 这个服务里提供的一些功能。
在 Nest 框架里,在类里注入它的依赖,只需要在这个类的构造方法里面使用一个参数属性,再设置一下这个参数的类型就可以了。
比如在这个 AppController 类的构造方法里面,添加了一个参数属性,名字是 appService,设置了一下参数的类型,就是 AppService。这个 AppService 是在 app.service.ts 文件里定义的。
Nest 在创建 AppController 类的实例的时候,发现它的构造方法里有这样的参数属性,就知道这个类需要注入一个依赖,依赖的东西是 AppService,也就是给这个构造方法参数设置的这个类型。Nest 会找到这个 AppService,创建一个它的实例,或者如果这个类的实例已经存在了,就会获取到这个类的实例,再把它注入到这个 AppController 类里面。
在这个 AppController 类里面,可以通过 appService 属性,使用 AppService 服务上面的功能。
打开这个文件,你会发现,它里面定义了一个 AppService 类,注意这个类会用 @Injectable 装饰器装饰一下。在这个类里面有一个 getHello 方法,这个方法做的事情就是返回一个 Hello World 。
在类里面注入依赖,除了要在这个类的构造方法里声明一下要注入的依赖,另外还得再去做点配置。打开 app.module.ts,你会发现给这个模块的 @Module 装饰器提供的对象参数里面,有一个 providers,在它里面添加了一个 AppService ,只有这样,Nest 才能够正确的在 AppController 里面,注入它依赖的 AppService。