【小白鲨笔记】Nestjs(二)

二、IoC控制反转、DI依赖注入

在正式进入Nestjs的学习之前,这里有几个前端不常用的代码设计细节需要理解,这样才能更好的理解nest的设计理念。

控制反转(Inversion of Control):是将程序的操作对象调用权交给容器(container),从而实现对象组件的装配和管理。其概念就是,将组件对象的控制权从程序代码本身转移到了外部容器。

之前的程序有可能会出现较多的维护问题,列如:若A类中的功能需要借助B类进行实现(B是A的依赖),那么在A内部去实例化B,则两者只花钱会出现较高的耦合。一旦B需要更改,则A也需随之进行更改。当多个类之间有许多的依赖关系,那程序将变得极难维护,从而出现许多问题。

因此,为了解决以上问题,诞生了IoC,将A类对B类的控制权抽离出来,交给第三方(容器)去做,也就是把控制权反转给第三方。

依赖注入(Dependency Injection)与控制反转概念是一样的,不同的是从另一个角度去看待。由IoC容器在运行期间动态地将某种依赖关系注入对象之中。

控制反转是一种思想、能够解决问题的一种可能的结果,而依赖注入则是其最典型的实现方法(可以拿对象=IoC与实例=DI进行对比)。

总结:由IoC容器来控制依赖,通过构造函数、属性或者工厂模式等方法,注入到类A内,进行解耦。

控制反转/依赖注入的优点:

  1. 可维护性较好:便于单元测试、调试程序和诊断故障(彼此之间互不影响)。
  2. 大中型项目中,团队成员分工明确,不用依赖于他人的组件。
  3. 可复用性好:可以把具有普遍性的常用组件独立出来,反复应用到项目中的其他部分。
  4. 生成对象的方式转为外置方式:把对象生成放在配置文件中进行定义。

例子:

  1. 没有使用控制反转的效果:

    class A {
    	name: string;
    	constructor(name: string){ this.name = name	}
    }
    class B {
    	need: A;
    	constructor(){ this.need = new A('小白鲨') }
    }
    console.log(new B().need.name)
    
  2. 使用控制反转后的效果:

    // 中间件:IoC容器
    class Container {
    	modules: any
    	constructor() {	this.modules = {} }
    	// 在容器中注册类
    	provide(key: string, module: any){ this.modules[key] = module }
    	// 获取容器中的类
    	get(key) { return this.modules[key] }
    }
    const ioc = new Container()
    class A {
    	name: string
    	constructor(name: string) { this.name = name }
    }
    ioc.provide('a', new A('小白鲨'))
    class B {
    	a: any
    	contructor(container: Container) { this.a = container.get('a') }
    }
    console.log(new B(ioc).a.name)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值