什么是依赖注入呢?我们不通过 new 的方式在类内部创建依赖类的对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类来使用。
看一段代码:
代码语言:javascript复制class Cat(){
}
class Tiger(){
}
class Zoo(){
constructor(){
this.tiger = new Tiger();
this.cat = new Cat();
}
}
上述的例子中,我们定义Zoo,在其constructor的方法中进行对于Cat和Tiger的实例化,此时如果我们要为Zoo增加一个实例变量,比如去修改Zoo类本身,比如我们现在想为Zoo类增加一个Fish类的实例变量:
代码语言:javascript复制class Fish(){}
class Zoo(){
constructor(){
this.tiger = new Tiger();
this.cat = new Cat();
this.fish = new Fish();
}
}
此外如果我们要修改在Zoo中实例化时,传入Tiger和Cat类的变量,也必须在Zoo类上修改。这种反反复复的修改会使得Zoo类并没有通用性,使得Zoo类的功能需要反复测试。
我们设想将实例化的过程以参数的形式传递给Zoo类:
代码语言:javascript复制class Zoo(){
constructor(options){
this.options = options;
}
}
var zoo = new Zoo({
tiger: new Tiger(),
cat: new Cat(),
fish: new Fish()
})
我们将实力化的过程放入参数中,传入给Zoo的构造函数,这样我们就不用在Zoo类中反复的去修改代码。这是一个简单的介绍依赖注入的例子。
再来总结下:依赖注入就是不通过 new 的方式在类内部创建依赖类的对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类来使用。
我们看下anguler的依赖注入是如何做的:
代码语言:javascript复制var myapp=angular.module('myapp',['ui.router']);
myapp.controller('test1',function($scope,$timeout){}
myapp.controller('test2',function($scope,$state){}
其结构如图:
再来看下nestjs的依赖注入,nestjs依赖注入实现的更为彻底,nestjs的模块、服务都遵循依赖注入规则:
代码语言:javascript复制@Module({
imports:[otherModule],
providers:[SaveService],
controllers:[SaveController,SaveExtroController]
})
export class SaveModule {}
上面就是nestjs中如何定一个module,在imports属性中可以注入其他模块,在prividers注入相应的在控制器中需要用到的service,在控制器中注入需要的controller。
再举一个例子,在某一个控制器中使用另外一个服务,依赖注入的实现代码:
代码语言:javascript复制import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { PostsService } from './posts.service';
import { CreatePostDto } from './dto/create-post.dto';
import { UpdatePostDto } from './dto/update-post.dto';
import { EventsGateway } from '../events/events.gateway'
@Controller('posts')
export class PostsController {
constructor(private readonly postsService: PostsService,
private readonly eventsGateway:EventsGateway ) {}
@Post()
create(@Body() createPostDto: CreatePostDto) {
return this.postsService.create(createPostDto);
}
@Get()
findAll() {
console.log("socket publish")
this.eventsGateway.PublicMessage("hello world");
return "222"
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.postsService.findOne( id);
}
@Patch(':id')
update(@Param('id') id: string, @Body() updatePostDto: UpdatePostDto) {
return this.postsService.update( id, updatePostDto);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.postsService.remove( id);
}
}
在控制器的构造函数中,我们注入了websocket这个服务,这个服务的实例化是框架内部实现的,我们没有手动实例化。
以上便是根据anguler和nestjs对依赖注入的理解,希望对你有所帮助。