Nestjs模块机制的概念和实现原理

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

1 前言

Nest 提供了模块机制,通过在模块装饰器中定义提供者、导入、导出和提供者构造函数便完成了依赖注入,通过模块树组织整个应用程序的开发。按照框架本身的约定直接撸一个应用程序,是完全没有问题的。可是,于我而言对于框架宣称的依赖注入、控制反转、模块、提供者、元数据、相关装饰器等等,觉得缺乏一个更清晰系统的认识。

  • 为什么需要控制反转?
  • 什么是依赖注入?
  • 装饰器做了啥?
  • 模块 (@Module) 中的提供者(providers),导入(imports)、导出(exports)是什么实现原理?

好像能够理解,能够意会,但是让我自己从头说清楚,我说不清楚。于是进行了一番探索,便有了这篇文章。从现在起,我们从新出发,进入正文。

2 两个阶段

2.1 Express、Koa

一个语言和其技术社区的发展过程,一定是从底层功能逐渐往上丰富发展的,就像是树根慢慢生长为树枝再长满树叶的过程。在较早,Nodejs 出现了 Express 和 Koa 这样的基本 Web 服务框架。能够提供一个非常基础的服务能力。基于这样的框架,大量的中间件、插件开始在社区诞生,为框架提供更加丰富的服务。我们需要自己去组织应用依赖,搭建应用脚手架,灵活又繁琐,也具有一定工作量。

发展到后面,一些生产更高效、规则更统一的框架便诞生了,开启了一个更新的阶段。

2.2 EggJs、Nestjs

为了更加适应快速生产应用,统一规范,开箱即用,便发展出了 EggJs、NestJs、Midway等框架。此类框架,通过实现底层生命周期,将一个应用的实现抽象为一个通用可扩展的过程,我们只需要按照框架提供的配置方式,便可以更简单的实现应用程序。框架实现了程序的过程控制,而我们只需要在合适位置组装我们的零件就行,这看起来更像是流水线工作,每个流程被分割的很清楚,也省去了很多实现成本。

2.3 小结

上面的两个阶段只是一个铺垫,我们可以大致了解到,框架的升级是提高了生产效率,而要实现框架的升级,就会引入一些设计思路和模式,Nest 中就出现了控制反转、依赖注入、元编程的概念,下面我们来聊聊。

3 控制反转和依赖注入

3.1 依赖注入

一个应用程序实际就是非常多的抽象类,通过互相调用实现应用的所有功能。随着应用代码和功能复杂度的增加,项目一定会越来越难以维护,因为类越来越多,相互之间的关系越来越复杂。

举个例子,假如我们使用 Koa 开发我们的应用,Koa 本身主要实现了一套基础的 Web 服务能力,我们在实现应用的过程中,会定义很多类,这些类的实例化方式、相互依赖关系,都会由我们在代码逻辑自由组织和控制。每个类的实例化都是由我们手动 new,并且我们可以控制某个类是只实例化一次然后被共享,还是每次都实例化。下面的 B 类依赖 A,每次实例化 B 的时候,A 都会被实例化一次,所以对于每个实例 B 来说,A 是不被共享的实例。

class A{}
// B
class B{
    contructor(){
        this.a = new A();
    }
}

下面的 C 是获取的外部实例,所以多个 C 实例是共享的 app.a 这个实例。

class A{}
// C
const app = {};
a
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值