依赖注入的简单理解

2021-12-08 11:01:56 浏览数 (1)

什么是依赖注入呢?我们不通过 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){}

其结构如图:

anguler的依赖注入anguler的依赖注入

再来看下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对依赖注入的理解,希望对你有所帮助。

0 人点赞